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)
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)
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()
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
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()
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
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)
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
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") # 运行结束后把设备状态改回来