Ejemplo n.º 1
0
    def report(self, template_name, output_file=None, record_list=None):
        self._load()
        steps = self._analyse()
        info = json.loads(get_script_info(self.script_root))

        if self.export_dir:
            self.script_root, self.log_root = self._make_export_dir()
            output_file = os.path.join(self.script_root, HTML_FILE)
            self.static_root = "static/"

        if not record_list:
            record_list = [
                f for f in os.listdir(self.log_root) if f.endswith(".mp4")
            ]
        records = [os.path.join(self.log_root, f) for f in record_list]

        if not self.static_root.endswith(os.path.sep):
            self.static_root = self.static_root.replace("\\", "/")
            self.static_root += "/"

        data = {}
        data['steps'] = steps
        data['name'] = self.script_root
        data['scale'] = self.scale
        data['test_result'] = self.test_result
        data['run_end'] = self.run_end
        data['run_start'] = self.run_start
        data['static_root'] = self.static_root
        data['lang'] = self.lang
        data['records'] = records
        data['info'] = info

        return self._render(template_name, output_file, **data)
Ejemplo n.º 2
0
def main(argv=None):
    ap = get_parser()
    args = ap.parse_args(argv)
    if args.action == "info":
        from airtest.cli.info import get_script_info
        print(get_script_info(args.script))
    elif args.action == "report":
        from airtest.report.report import main as report_main
        report_main(args)
    elif args.action == "run":
        from airtest.cli.runner import run_script
        run_script(args)
Ejemplo n.º 3
0
 def setUpClass(cls):
     #由子类构造日志目录和脚本目录
     #取得case相关信息
     if ST.REPORT_PATH:
         #生成日志需要配置这些信息  如果不配置日志路径  将不会生成报告和日志
         infor=json.loads(get_script_info(cls.file)) #获得脚本信息
         cls.__logPath, cls.__reportPath = makePath(cls.file)
         # 是否录像标志
         cls.__recording=ST.RECORDING #type:bool
         makeCaseInfo(cls.file, cls.__reportPath,infor)
         auto_setup(basedir=cls.file, logdir=cls.__logPath)
     else:
         auto_setup()
Ejemplo n.º 4
0
    def report_data(self,
                    output_file=None,
                    record_list=None,
                    logfile=None,
                    test_name=None,
                    script_name=None):
        """
        Generate data for the report page
        :param output_file: The file name or full path of the output file, default HTML_FILE
        :param record_list: List of screen recording files
        :return:
        """
        logs = self._load(logfile)
        steps = self._analyse(logs)
        script_path = os.path.join(self.script_root, script_name
                                   or self.script_name)
        info = json.loads(get_script_info(script_path))

        records = [
            os.path.join(LOGDIR, f) if self.export_dir else os.path.abspath(
                os.path.join(self.log_root, f)) for f in record_list
        ]

        if not self.static_root.endswith(os.path.sep):
            self.static_root = self.static_root.replace("\\", "/")
            self.static_root += "/"

        data = {}
        data['steps'] = steps
        data['name'] = self.script_root
        data['scale'] = self.scale
        data['test_result'] = self.test_result
        data['run_end'] = self.run_end
        data['run_start'] = self.run_start
        data['static_root'] = self.static_root
        data['lang'] = self.lang
        data['records'] = records
        data['info'] = info
        data['log'] = self.get_relative_log(output_file)
        data['console'] = self.get_console(output_file)
        data['device'] = self.device
        data['cpu_memory'] = self.get_cpu_memory(
            test_name)  # 增加了 cpu_memory 信息
        data['package'] = self.package_name  # 增加了 包 信息
        data['test_name'] = test_name  # 增加了测试名称信息
        data['data'] = json.dumps(data)
        return data
Ejemplo n.º 5
0
def main(argv=None):
    ap = get_parser()
    args = ap.parse_args(argv)
    if args.action == "info":
        from airtest.cli.info import get_script_info
        print(get_script_info(args.script))
    elif args.action == "report":
        from airtest.report.report import main as report_main
        report_main(args)
    elif args.action == "run":
        from airtest.cli.runner import run_script
        run_script(args)
    elif args.action == "version":
        from airtest.utils.version import show_version
        show_version()
    else:
        ap.print_help()
Ejemplo n.º 6
0
    def report_data(self, output_file=None, record_list=None):
        """
        Generate data for the report page

        :param output_file: The file name or full path of the output file, default HTML_FILE
        :param record_list: List of screen recording files
        :return:
        """
        self._load()
        steps = self._analyse()

        script_path = os.path.join(self.script_root, self.script_name)
        info = json.loads(get_script_info(script_path))

        if record_list:
            records = [os.path.join(DEFAULT_LOG_DIR, f) if self.export_dir
                       else os.path.abspath(os.path.join(self.log_root, f)) for f in record_list]
        else:
            records = []

        if not self.static_root.endswith(os.path.sep):
            self.static_root = self.static_root.replace("\\", "/")
            self.static_root += "/"

        if not output_file:
            output_file = HTML_FILE

        data = {}
        data['steps'] = steps
        data['name'] = self.script_root
        data['scale'] = self.scale
        data['test_result'] = self.test_result
        data['run_end'] = self.run_end
        data['run_start'] = self.run_start
        data['static_root'] = self.static_root
        data['lang'] = self.lang
        data['records'] = records
        data['info'] = info
        data['log'] = self.get_relative_log(output_file)
        data['console'] = self.get_console(output_file)
        # 如果带有<>符号,容易被highlight.js认为是特殊语法,有可能导致页面显示异常,尝试替换成不常用的{}
        info = json.dumps(data).replace("<", "{").replace(">", "}")
        data['data'] = info
        return data
Ejemplo n.º 7
0
    def report(self, template_name, output_file=None, record_list=None):
        self._load()
        steps = self._analyse()

        script_path = os.path.join(self.script_root, self.script_name)
        info = json.loads(get_script_info(script_path))

        if self.export_dir:
            self.script_root, self.log_root = self._make_export_dir()
            # output_file可传入文件名,或绝对路径
            output_file = output_file if output_file and os.path.isabs(output_file) \
                else os.path.join(self.script_root, output_file or HTML_FILE)
            if not self.static_root.startswith("http"):
                self.static_root = "static/"

        if not record_list:
            record_list = [
                f for f in os.listdir(self.log_root) if f.endswith(".mp4")
            ]
        records = [
            os.path.join(LOGDIR, f) if self.export_dir else os.path.abspath(
                os.path.join(self.log_root, f)) for f in record_list
        ]

        if not self.static_root.endswith(os.path.sep):
            self.static_root = self.static_root.replace("\\", "/")
            self.static_root += "/"

        data = {}
        data['steps'] = steps
        data['name'] = self.script_root
        data['scale'] = self.scale
        data['test_result'] = self.test_result
        data['run_end'] = self.run_end
        data['run_start'] = self.run_start
        data['static_root'] = self.static_root
        data['lang'] = self.lang
        data['records'] = records
        data['info'] = info
        data['data'] = json.dumps(data)

        return self._render(template_name, output_file, **data)
Ejemplo n.º 8
0
    def makeData(self):
        self._load()
        steps = self._analysis()

        path, self.script_name = script_dir_name(self.script_root)
        script_path = os.path.join(self.script_root, self.script_name)
        info = json.loads(get_script_info(script_path))

        #mpr repord
        record_list = [
            f for f in os.listdir(self.log_root) if f.endswith(".mp4")
        ]
        records = [
            os.path.join(LOGDIR, f) if self.export_dir else os.path.abspath(
                os.path.join(self.log_root, f)) for f in record_list
        ]

        scriptname = self.script_name
        if self.needResetPath:
            scriptname = self.splitPath(self.script_root, self.caseName)
            info['path'] = self.splitPath(info['path'], self.caseName)

        data = {}
        data['steps'] = steps
        data['name'] = scriptname
        data['test_result'] = self.test_result
        data['field_num'] = self.FieldNum
        data['run_end'] = self.run_end
        data['run_start'] = self.run_start
        #data['static_root'] = self.static_root
        data['records'] = records
        data['info'] = info
        #        data['log'] = self.get_relative_log(output_file)
        #        data['console'] = self.get_console(output_file)
        # 如果带有<>符号,容易被highlight.js认为是特殊语法,有可能导致页面显示异常,尝试替换成不常用的{}
        info = json.dumps(data).replace("<", "{").replace(">", "}")
        # data['data'] = info
        return data
Ejemplo n.º 9
0
    def run_case(self, test_cases_name):

        # airtest report auto_ui/got/test_ch1.air --export ${reportDir}
        # 获取yaml文件的路径
        obj_path = os.path.abspath(
            os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
        yml_path = obj_path + "\case.yml"
        print(yml_path)
        with open(yml_path, 'r', encoding='utf-8') as f:
            cases = yaml.load(f)
        air_case_path_list = []
        case_name_dic = {}
        for case_name in cases[test_cases_name]:
            # 拼接yaml下case的路径
            air_case_path = obj_path + '\\' + case_name + ".air"
            case_name_dic[air_case_path] = case_name
            air_case_path_list.append(air_case_path)
        run_phone_id = ""
        # 根据当前手机列表,查找配置文件中空闲状态的手机
        for phone_id in self.phone_id_list:
            phone_status = self.info.get_config("Phone_List", phone_id)
            if phone_status == "None":
                run_phone_id = phone_id
                break
        # 运行开始时设置设备状态
        self.info.set_config("Phone_List", run_phone_id, "Runing")
        # 存放Htlm报告的目录

        name = ""
        defeated_case_list = []
        # 按顺序执行case.yml中的用例
        for i in range(len(air_case_path_list)):
            case_run_path = air_case_path_list[i]
            cmd_run_case = "airtest run " + case_run_path + " --device Android://127.0.0.1:5037:" + run_phone_id + " --log"
            proc = subprocess.Popen(cmd_run_case,
                                    shell=True,
                                    stdout=subprocess.PIPE)
            print(proc.communicate()[0])  # 从线程中获取值
            code = proc.returncode
            if code == 0:
                color = "blue"
                is_success_str = "成功"
            else:
                color = "red"
                # 很蛋疼,没有预留单独的case_name,只能先这样
                for case_name in cases[test_cases_name]:
                    if case_name in case_run_path:
                        defeated_case_list.append(case_name)
                is_success_str = "失败"
                self.info.set_config("Case_defeated__List",
                                     case_name_dic[case_run_path],
                                     is_success_str)
            static_root = "https://ep.yoozoo.com/public/static/airtest"
            cmd_make_html = "airtest report " + case_run_path + " --export " + case_run_path + " --static_root " + static_root + " --lang zh"
            # 执行完用例之后生成报告
            subprocess.Popen(cmd_make_html, shell=True, stdout=subprocess.PIPE)
            if case_run_path != "":
                info = json.loads(get_script_info(case_run_path),
                                  encoding='utf-8')
                name = info.get('title')
                if len(name) == 0:
                    name = case_name_dic[case_run_path]
            html_path = case_run_path
            case_air_log_name = case_name_dic[
                case_run_path] + ".log"  # 日志文件夹的名称
            # html_path_name_dic[name] = [html_path,case_air_log_name,case_name_dic[case_run_path]]
            self.info.set_config(
                "Html_path_name_dic", name,
                str([
                    html_path, case_air_log_name, case_name_dic[case_run_path]
                ]))
            my_html_file_path_new = self.info.get_config(
                "HtlmPath", "log_path")
            html_path = my_html_file_path_new + "/" + case_name_dic[
                case_run_path] + ".log" + "/log.html"
            self.bodys = '''<div><body><a href="''' + html_path + '''">''' + name + is_success_str + '''</a></body></div>'''
            self.info.set_config("Http_path_list",
                                 case_name_dic[case_run_path], self.bodys)
        # 把失败的项写入yml中
        with open(yml_path, 'w', encoding='utf-8') as f:
            cases["defeated_cases"] = defeated_case_list
            yaml.safe_dump(cases, f)

        self.info.set_config("Phone_List", run_phone_id,
                             "None")  # 运行结束后把设备状态改回来