def test_html_report(self): runner = HttpRunner(failfast=True) summary = runner.run(self.testcase_cli_path) self.assertEqual(summary["stat"]["testcases"]["total"], 1) self.assertEqual(summary["stat"]["teststeps"]["total"], 10) self.assertEqual(summary["stat"]["teststeps"]["skipped"], 4) report_save_dir = os.path.join(os.getcwd(), 'reports', "demo") report.gen_html_report(summary, report_dir=report_save_dir) self.assertGreater(len(os.listdir(report_save_dir)), 0) shutil.rmtree(report_save_dir)
def test_html_report_with_fixed_report_file(self): runner = HttpRunner(failfast=True) summary = runner.run(self.testcase_cli_path) self.assertEqual(summary["stat"]["testcases"]["total"], 1) self.assertEqual(summary["stat"]["teststeps"]["total"], 10) self.assertEqual(summary["stat"]["teststeps"]["skipped"], 4) report_file = os.path.join(os.getcwd(), 'reports', "demo", "test.html") report.gen_html_report(summary, report_file=report_file) report_save_dir = os.path.dirname(report_file) self.assertEqual(len(os.listdir(report_save_dir)), 1) self.assertTrue(os.path.isfile(report_file)) shutil.rmtree(report_save_dir)
def run(): runner = HttpRunner(failfast=False, log_level='INFO') run_report_path = r"reports/" + time.strftime('%Y%m%d%H%M%S') + ".html" # 2、运行用例 # run方法支持如下参数: # yml用例文件的路径 # 字典(用例的信息) # runner.run('testsuites/') # gen_html_report(runner._summary, report_template="templates/extent-theme-template.html") summary = runner.run(r'testsuites', dot_env_path='conf/env/.online_zy.env') gen_html_report(summary, report_file=run_report_path) print("报告地址:", os.path.abspath('.') + '/' + run_report_path)
def test_html_report_xss(self): testcases = [{ "config": { 'name': "post data" }, "teststeps": [{ "name": "post data", "request": { "url": "{}/anything".format(HTTPBIN_SERVER), "method": "POST", "headers": { "Content-Type": "application/json" }, "json": { 'success': False, "person": "<img src=x onerror=alert(1)>" } }, "validate": [{ "eq": ["status_code", 200] }] }] }] tests_mapping = {"testcases": testcases} summary = self.runner.run(tests_mapping) report_path = report.gen_html_report(summary) with open(report_path) as f: content = f.read() m = re.findall( re.escape( ""person": "<img src=x onerror=alert(1)>"" ), content) self.assertEqual(len(m), 2)
def run(self, testdata): data = json.loads(testdata) runner = HttpRunner(failfast=False) runner.run_tests(data) self.summary = runner._summary report_dir = os.path.join(urls.get_media_root(), "reports") self.reportpath = gen_html_report(self.summary, report_dir=report_dir)
def test_html_report_repsonse_image(self): runner = HttpRunner(failfast=True) summary = runner.run("tests/httpbin/load_image.yml") report_save_dir = os.path.join(os.getcwd(), 'reports', "demo") report_path = report.gen_html_report(summary, report_dir=report_save_dir) self.assertTrue(os.path.isfile(report_path)) shutil.rmtree(report_save_dir)
def runtestcase(self, test_path=None, report_title=None, **kwargs): buildId = os.environ.get('BUILD_ID', '') templatePath = os.path.join(os.path.dirname(os.path.dirname(__file__)), "templates", "report_template.html") runner = HttpRunner(failfast=False, log_level=self.log_level, log_file=None) #,report_template=templatePath) runner.run(test_path) runner._summary['html_report_name'] = report_title report.gen_html_report(runner._summary, report_template=templatePath) # #修改原生框架生成的报告名 start_datetime = runner._summary["time"]["start_datetime"] start_at_timestamp = str( runner._summary["time"]["start_at"]).split('.')[0] report_file_name = "{}.html".format( start_datetime.replace(":", "").replace("-", "")) report_dir = os.path.join(os.getcwd(), "reports") reporttime = RunTime().getToDateTime(int(start_at_timestamp), "%Y-%m-%d_%H_%M_%S") report_file = os.path.join(report_dir, report_file_name) if os.path.exists(report_file): if buildId: self.reportName = report_title + "{}.html".format(buildId) reportpath = os.path.join(report_dir, self.reportName) else: reportpath = os.path.join( report_dir, report_title + "{}.html".format(str(reporttime))) os.rename(report_file, reportpath) self.summary = runner._summary args = kwargs.get('args') if args and args.testType == TEST_TYPE_1: fail = self.summary.get("stat").get('testcases').get('fail', 0) if fail > 0 and buildId: fail_dir = os.path.join(os.getcwd(), "failReports") if not os.path.exists(fail_dir): os.mkdir(fail_dir) shutil.copy(reportpath, fail_dir) return self.summary
def add_test_reports(runner, report_name=None): """ 定时任务或者异步执行报告信息落地 :param start_at: time: 开始时间 :param report_name: str: 报告名称,为空默认时间戳命名 :param kwargs: dict: 报告结果值 :return: """ time_stamp = int(runner.summary["time"]["start_at"]) runner.summary['time']['start_datetime'] = datetime.datetime.fromtimestamp( time_stamp).strftime('%Y-%m-%d %H:%M:%S') report_name = report_name if report_name else runner.summary['time'][ 'start_datetime'] runner.summary['html_report_name'] = report_name report_path = os.path.join( os.getcwd(), "reports{}{}.html".format(separator, int(runner.summary['time']['start_at']))) # v2中runner没有gen_html_report方法了,改为report.gen_html_report,模板换成v2改进版(改进v2模板的不符合jinja2语法的部分) # runner.gen_html_report(html_report_template=os.path.join(os.getcwd(), "templates{}extent_report_template.html".format(separator))) report_path = report.gen_html_report( runner.summary, report_template=os.path.join( os.getcwd(), "templates{}extent-theme-template-report.html".format(separator))) with open(report_path, encoding='utf-8') as stream: reports = stream.read() test_reports = { 'report_name': report_name, 'status': runner.summary.get('success'), # v2中summary无summary[stat][sucess]和summary[stat][testsRun]数据结构了 # 'successes': runner.summary.get('stat').get('successes'), # 'testsRun': runner.summary.get('stat').get('testsRun'), 'successes': runner.summary.get('stat').get('teststeps').get('successes'), 'testsRun': runner.summary.get('stat').get('teststeps').get('total'), 'start_at': runner.summary['time']['start_datetime'], 'reports': reports } test_reports_obj = TestReports.objects.create(**test_reports) return report_path, test_reports_obj.id
def create_report(summary, report_name): """ 创建测试报告 :param summary: runner 跑完的对象 :param runner: HttpRunner对象 :param report_name: 自定义报告名称 :return: """ # 定义报告名称并生成报告且获取报告内容 report_path = report.gen_html_report(summary, report_template=r"stucit/template_new.html") # 继续格式化summary summary['time']['start_at'] = datetime. \ fromtimestamp(int(summary['time']['start_at'])).strftime('%Y-%m-%d %H:%M:%S') summary['time']['duration'] = round(summary['time']['duration'], 2) for detail in summary['details']: detail['time']['duration'] = round(detail['time']['duration'], 2) # 处理前端所需数据 case_list = [] result_list = [] case_details = [] hasbeen = [] i = 1 for detail in summary.get("details"): if detail.get("records"): for record in detail.get("records"): case = {"value": i, "name": record.get("name")} if record.get("status") == "success": name = "成功" elif record.get("status") == "error": name = "失败" else: name = "跳过" case_detail = {"result": record.get("status"), "case": i, "record": json.dumps(record)} i += 1 case_list.append(case) case_details.append(case_detail) # 判断是否已经存在 if not record.get("status") in hasbeen: result = {"value": record.get("status"), "name": name} result_list.append(result) hasbeen.append(record.get("status"))
def run_testsuit_by_suit_id(suit_id, user): data = TestSuit.get_content_by_suit_id(suit_id) suit_content = data.get('suit_content') project_id = data.get('project_id') case_id_env_id_list = [] for content in suit_content: case_id_env_id_list.append({ 'exec_id': content.get('exec_id'), 'env_id': content.get('env_id') }) test_suit_parse = case_handle.TestSuitParse(case_id_env_id_list, project_id) suite = test_suit_parse.get_httprunner_test_suite_json() runner = HttpRunner() result = runner.run(suite) report_save_path = os.path.join(os.getcwd(), 'openapi/reports') report_path = report.gen_html_report(result, report_dir=report_save_path) Report.create(report_path, suit_id, user) return report_path.split('/')[-1]
def main(): """ API test: parse command line options and run commands. """ parser = argparse.ArgumentParser(description=__description__) parser.add_argument( '-V', '--version', dest='version', action='store_true', help="show version") parser.add_argument( 'testfile_paths', nargs='*', help="Specify api/testcases/testsuites file paths to run.") parser.add_argument( '--log-level', default='INFO', help="Specify logging level, default is INFO.") parser.add_argument( '--log-file', help="Write logs to specified file path.") parser.add_argument( '--dot-env-path', help="Specify .env file path, which is useful for keeping sensitive data.") parser.add_argument( '--report-template', help="Specify report template path.") parser.add_argument( '--report-dir', help="Specify report save directory.") parser.add_argument( '--report-file', help="Specify report file path, this has higher priority than specifying report dir.") parser.add_argument( '--save-tests', action='store_true', default=False, help="Save loaded/parsed/vars_out/summary json data to JSON files.") parser.add_argument( '--failfast', action='store_true', default=False, help="Stop the test run on the first error or failure.") parser.add_argument( '--startproject', help="Specify new project name.") args = parser.parse_args() if len(sys.argv) == 1: # no argument passed parser.print_help() sys.exit(0) if args.version: print(f"{__version__}") sys.exit(0) project_name = args.startproject if project_name: create_scaffold(project_name) sys.exit(0) runner = HttpRunner( failfast=args.failfast, save_tests=args.save_tests, log_level=args.log_level, log_file=args.log_file ) err_code = 0 try: for path in args.testfile_paths: summary = runner.run(path, dot_env_path=args.dot_env_path) report_dir = args.report_dir or os.path.join(os.getcwd(), "reports") gen_html_report( summary, report_template=args.report_template, report_dir=report_dir, report_file=args.report_file ) err_code |= (0 if summary and summary["success"] else 1) except Exception as ex: logger.error(f"!!!!!!!!!! exception stage: {runner.exception_stage} !!!!!!!!!!\n{str(ex)}") sentry_sdk.capture_exception(ex) err_code = 1 sys.exit(err_code)
#创建连接对象 conn = psycopg2.connect(database=db, user=user, password=passwd, host=host, port=port) cur = conn.cursor() #创建指针对象 #删除数据 cur.execute("DELETE FROM meetings WHERE name LIKE %s", ('AUTOTEST_%', )) cur.execute("DELETE FROM organs WHERE phone LIKE %s", ('190%', )) # 关闭连接 conn.commit() cur.close() conn.close() if __name__ == '__main__': print("Start....") runner = HttpRunner(failfast=False) #执行测试用例集 summary = runner.run('./testsuites') #生成报告 gen_html_report(summary) #清理测试数据 clean_data() #推送钉钉消息 DataInteg.genHtml(summary) print("End....")
def main(): """ API test: parse command line options and run commands. """ if is_py2: color_print(get_python2_retire_msg(), "YELLOW") parser = argparse.ArgumentParser(description=__description__) parser.add_argument( '-V', '--version', dest='version', action='store_true', help="show version") parser.add_argument( 'testfile_paths', nargs='*', help="Specify api/testcase/testsuite file paths to run.") parser.add_argument( '--log-level', default='INFO', help="Specify logging level, default is INFO.") parser.add_argument( '--log-file', help="Write logs to specified file path.") parser.add_argument( '--dot-env-path', help="Specify .env file path, which is useful for keeping sensitive data.") parser.add_argument( '--report-template', help="Specify report template path.") parser.add_argument( '--report-dir', help="Specify report save directory.") parser.add_argument( '--report-file', help="Specify report file path, this has higher priority than specifying report dir.") parser.add_argument( '--save-tests', action='store_true', default=False, help="Save loaded/parsed/summary json data to JSON files.") parser.add_argument( '--failfast', action='store_true', default=False, help="Stop the test run on the first error or failure.") parser.add_argument( '--startproject', help="Specify new project name.") parser.add_argument( '--validate', nargs='*', help="Validate JSON testcase format.") parser.add_argument( '--prettify', nargs='*', help="Prettify JSON testcase format.") args = parser.parse_args() if len(sys.argv) == 1: # no argument passed parser.print_help() sys.exit(0) if args.version: color_print("{}".format(__version__), "GREEN") sys.exit(0) if args.validate: validate_json_file(args.validate) sys.exit(0) if args.prettify: prettify_json_file(args.prettify) sys.exit(0) project_name = args.startproject if project_name: create_scaffold(project_name) sys.exit(0) runner = HttpRunner( failfast=args.failfast, save_tests=args.save_tests, log_level=args.log_level, log_file=args.log_file ) err_code = 0 try: for path in args.testfile_paths: summary = runner.run(path, dot_env_path=args.dot_env_path) report_dir = args.report_dir or os.path.join(runner.project_working_directory, "reports") gen_html_report( summary, report_template=args.report_template, report_dir=report_dir, report_file=args.report_file ) err_code |= (0 if summary and summary["success"] else 1) except Exception as ex: color_print("!!!!!!!!!! exception stage: {} !!!!!!!!!!".format(runner.exception_stage), "YELLOW") color_print(str(ex), "RED") capture_exception(ex) err_code = 1 sys.exit(err_code)