def test_html_report_repsonse_image(self): testset_path = "tests/httpbin/load_image.yml" runner = HttpRunner().run(testset_path) summary = runner.summary output_folder_name = os.path.basename(os.path.splitext(testset_path)[0]) report = runner.gen_html_report(html_report_name=output_folder_name) self.assertTrue(os.path.isfile(report)) report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name) shutil.rmtree(report_save_dir)
def test_html_report(self): kwargs = {} output_folder_name = os.path.basename(os.path.splitext(self.testset_path)[0]) runner = HttpRunner().run(self.testset_path) summary = runner.summary self.assertEqual(summary["stat"]["testsRun"], 10) self.assertEqual(summary["stat"]["skipped"], 4) runner.gen_html_report(html_report_name=output_folder_name) report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name) shutil.rmtree(report_save_dir)
def run_batch_test(request): """ 批量运行用例 :param request: :return: """ if request.session.get('login_status'): kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) if request.is_ajax(): try: kwargs = json.loads(request.body.decode('utf-8')) except ValueError: logging.error('待运行用例信息解析异常:{kwargs}'.format(kwargs=kwargs)) return HttpResponse('信息解析异常,请重试') test_list = kwargs.pop('id') base_url = kwargs.pop('env_name') type = kwargs.pop('type') config = kwargs.pop('config') report_name = kwargs.get('report_name', None) testcases_dict = run_by_batch(test_list, base_url, config, type=type) if not testcases_dict: return HttpResponse('没有用例哦') main_hrun.delay(testcases_dict, report_name) return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告') else: type = request.POST.get('type', None) base_url = request.POST.get('env_name') config = request.POST.get('config') test_list = request.body.decode('utf-8').split('&') if type: testcases_lists = run_by_batch(test_list, base_url, config, type=type, mode=True) else: testcases_lists = run_by_batch(test_list, base_url, config) if testcases_lists: runner.run(testcases_lists) return render_to_response('report_template.html', runner.summary) else: # 没有用例默认重定向到首页 return HttpResponseRedirect('/api/index/') else: return HttpResponseRedirect("/api/login/")
def batch_main_hrun(testset_path, executor=None, request_data=None): """ 用例运行 :param testset_path: dict or list :param report_name: str :return: """ logger.setup_logger('INFO') kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) error_info = { 'start_time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') } report_type = 'test' report_name = '执行异常' try: test_list = request_data.pop('id') base_url = request_data.pop('env_name') type = request_data.pop('type') report_name = request_data.get('report_name', None) if type: report_type = type run_by_batch(test_list, base_url, testset_path, type=type) runner.run2(testset_path) shutil.rmtree(testset_path) runner.summary = timestamp_to_datetime(runner.summary) report_path = add_test_reports(runner, report_name=report_name, report_type=report_type, executor=executor) except Exception as e: logger.log_info("出现异常: {0}".format(e)) error_info['error_msg'] = "出现异常: {0}".format(e) add_error_reports(error_info, report_name=report_name, report_type=report_type, executor=executor) except BaseException as e: logger.log_info("出现异常: {0}".format(e)) error_info['error_msg'] = "出现异常: {0}".format(e) add_error_reports(error_info, report_name=report_name, report_type=report_type, executor=executor)
def run_test(request): id = request.POST.get('id') base_url = request.POST.get('env_name') kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) ct = time.time() local_time = time.localtime(ct) data_head = time.strftime("%Y-%m-%d %H-%M-%S", local_time) data_secs = (ct - int(ct)) * 1000 time_stamp = "%s-%03d" % (data_head, data_secs) testcase_dir_path = os.path.join(os.getcwd(), "suite") testcase_dir_path = os.path.join(testcase_dir_path, time_stamp) config = { 'config': { 'name': 'base_url config', 'request': { 'base_url': base_url } } } testcase_list = [] testcase_list.append(config) try: obj = models.TestInfo.objects.get(id=id) except ObjectDoesNotExist: return testcase_list request = eval(obj.request) name = obj.test_name testcase_list.append(request) if not os.path.exists(testcase_dir_path): os.mkdir(testcase_dir_path) file_path = os.path.join(testcase_dir_path, name + ".yml") with io.open(file_path, 'w', encoding='utf-8') as stream: yaml.dump(testcase_list, stream, indent=4, default_flow_style=False, encoding='utf-8') runner.run(testcase_dir_path) return render_to_response('report_template.html', runner.summary)
def run_batch_test(request): if request.session.get('login_status'): if request.method == 'POST': base_url = request.POST.get('env_name') test_list = request.body.decode('utf-8').split('&') testcases_lists = run_by_batch(test_list, base_url) kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) runner.run(testcases_lists) return render_to_response('report_template.html', runner.summary) else: return HttpResponseRedirect("/api/login/")
def test_html_report(self): kwargs = {} output_folder_name = os.path.basename( os.path.splitext(self.testset_path)[0]) runner = HttpRunner().run(self.testset_path) summary = runner.summary self.assertEqual(summary["stat"]["testsRun"], 10) self.assertEqual(summary["stat"]["skipped"], 4) runner.gen_html_report(html_report_name=output_folder_name) report_save_dir = os.path.join(loader.project_working_directory, 'reports', output_folder_name) self.assertGreater(len(os.listdir(report_save_dir)), 0) shutil.rmtree(report_save_dir)
def run_test(request): """ 运行用例 :param request: :return: """ if request.session.get('login_status'): kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) testcase_dir_path = os.path.join(os.getcwd(), "suite") testcase_dir_path = os.path.join(testcase_dir_path, get_time_stamp()) if request.is_ajax(): try: kwargs = json.loads(request.body.decode('utf-8')) except ValueError: logging.error('待运行用例信息解析异常:{kwargs}'.format(kwargs=kwargs)) return HttpResponse('信息解析异常,请重试') id = kwargs.pop('id') base_url = kwargs.pop('env_name') type = kwargs.pop('type') config = request.POST.get( 'config') if request.POST.get('config') != "" else None run_by_module(id, base_url, testcase_dir_path, config) if type == 'module' \ else run_by_project(id, base_url, testcase_dir_path, config) report_name = kwargs.get('report_name', None) main_hrun.delay(testcase_dir_path, report_name) return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告') else: id = request.POST.get('id') base_url = request.POST.get('env_name') config = request.POST.get( 'config') if request.POST.get('config') != "" else None type = request.POST.get('type', None) if type: run_by_module(id, base_url, testcase_dir_path, config) if type == 'module' \ else run_by_project(id, base_url, testcase_dir_path, config) else: run_by_single(id, base_url, testcase_dir_path, config) runner.run(testcase_dir_path) shutil.rmtree(testcase_dir_path) return render_to_response('report_template.html', runner.summary) else: return HttpResponseRedirect("/api/login/")
def runcase(request): ct = time.time() local_time = time.localtime(ct) data_head = time.strftime("%Y-%m-%d %H-%M-%S", local_time) data_secs = (ct - int(ct)) * 1000 time_stamp = "%s-%03d" % (data_head, data_secs) kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) testcase_dir_path = os.path.join(os.getcwd(), "suite") testcase_dir_path = os.path.join(testcase_dir_path, time_stamp) if not os.path.exists(testcase_dir_path): os.mkdir(testcase_dir_path) url = request.POST['url'] method = request.POST['method'] base_url = request.POST['base_url'] config = { 'config': { 'name': 'base_url config', 'request': { 'base_url': base_url } } } testcase_list = [] testcase_list.append(config) req = {'method': method, 'url': url} req1 = {'name': 'find', 'request': req} testcase_list.append({'test': req1}) file_path = os.path.join(testcase_dir_path, "find.yml") with io.open(file_path, 'w', encoding='utf-8') as stream: yaml.dump(testcase_list, stream, indent=4, default_flow_style=False, encoding='utf-8') runner.run(testcase_dir_path) return render_to_response('report_template.html', runner.summary)
def test_run_httprunner_with_teardown_hooks_alter_response(self): testsets = [ { "name": "test teardown hooks", "config": { 'path': 'tests/httpbin/hooks.yml', }, "testcases": [ { "name": "test teardown hooks", "request": { "url": "http://127.0.0.1:3458/headers", "method": "GET", "data": "abc" }, "teardown_hooks": [ "${alter_response($response)}" ], "validate": [ {"eq": ["status_code", 500]}, {"eq": ["headers.content-type", "html/text"]}, {"eq": ["json.headers.Host", "127.0.0.1:8888"]}, {"eq": ["content.headers.Host", "127.0.0.1:8888"]}, {"eq": ["text.headers.Host", "127.0.0.1:8888"]}, {"eq": ["new_attribute", "new_attribute_value"]}, {"eq": ["new_attribute_dict.key", 123]} ] } ] } ] runner = HttpRunner().run(testsets) summary = runner.summary self.assertTrue(summary["success"])
def test_run_httprunner_with_teardown_hooks_error(self): testsets = [ { "name": "test teardown hooks", "config": { 'path': 'tests/httpbin/hooks.yml', }, "testcases": [ { "name": "test teardown hooks", "request": { "url": "http://127.0.0.1:3458/headers", "method": "GET", "data": "abc" }, "teardown_hooks": [ "${alter_response_error($response)}" ] } ] } ] runner = HttpRunner().run(testsets) summary = runner.summary self.assertFalse(summary["success"]) self.assertEqual(summary["stat"]["errors"], 1)
def test_run_yaml_upload(self): runner = HttpRunner().run("tests/httpbin/upload.yml") summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 1) self.assertIn("details", summary) self.assertIn("records", summary["details"][0])
def test_run_testsets_template_lambda_functions(self): testcase_file_path = os.path.join( os.getcwd(), 'tests/data/demo_testset_template_lambda_functions.yml') runner = HttpRunner().run(testcase_file_path) summary = runner.summary self.assertTrue(summary["success"])
def test_run_post_data(self): testsets = [{ "name": "post data", "testcases": [{ "name": "post data", "request": { "url": "http://127.0.0.1:3458/post", "method": "POST", "headers": { "Content-Type": "application/json" }, "data": "abc" }, "validate": [{ "eq": ["status_code", 200] }] }] }] runner = HttpRunner().run(testsets) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 1) self.assertEqual( summary["records"][0]["meta_data"]["response_body"]["data"], "abc")
def test_run_testset_layered(self): testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_layer.yml') runner = HttpRunner().run(testcase_file_path) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(len(summary["details"]), 1)
def main_ate(cases): # importlib.reload(httprunner) # print(cases) # importlib.reload(importlib.import_module('func_list.build_in_func')) runner = HttpRunner().run(cases) summary = runner.summary return summary
def test_run_httprunner_with_teardown_hooks_not_exist_attribute(self): testcases = [{ "name": "test teardown hooks", "config": { "path": "tests/httpbin/hooks.yml" }, "teststeps": [{ "name": "test teardown hooks", "request": { "url": "{}/headers".format(HTTPBIN_SERVER), "method": "GET", "data": "abc" }, "teardown_hooks": ["${alter_response($response)}"], "validate": [{ "eq": ["attribute_not_exist", "new_attribute"] }] }] }] runner = HttpRunner().run(testcases) summary = runner.summary self.assertFalse(summary["success"]) self.assertEqual(summary["stat"]["errors"], 1)
def main_hrun(testset_path, report_name): """ 用例运行 :param testset_path: dict or list :param report_name: str :return: """ logger.setup_logger('DEBUG') kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) run_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) runner.run(testset_path) add_test_reports(run_time, report_name=report_name, **runner.summary) return runner.summary
def test_run_httprunner_with_teardown_hooks_not_exist_attribute(self): testsets = [ { "name": "test teardown hooks", "config": { 'path': 'tests/httpbin/hooks.yml', }, "testcases": [ { "name": "test teardown hooks", "request": { "url": "http://127.0.0.1:3458/headers", "method": "GET", "data": "abc" }, "teardown_hooks": [ "${alter_response($response)}" ], "validate": [ {"eq": ["attributes.attribute_not_exist", "new_attribute"]} ] } ] } ] # with self.assertRaises(exceptions.AssertionError): runner = HttpRunner().run(testsets) summary = runner.summary self.assertFalse(summary["success"])
def test_run_testset_with_parameters(self): testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_parameters.yml') result = HttpRunner(testcase_file_path).run() self.assertTrue(result["success"]) self.assertIn("token", result["output"]) self.assertEqual(result["stat"]["testsRun"], 6)
def test_run_testcases_hardcode(self): runner = HttpRunner().run(self.testcase_file_path_list) summary = runner.summary self.assertTrue(summary["success"]) self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 6) self.assertEqual(summary["stat"]["successes"], 6)
def test_run_testset_with_variables_mapping(self): testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_layer.yml') variables_mapping = {"app_version": '2.9.7'} result = HttpRunner(testcase_file_path).run(mapping=variables_mapping) self.assertTrue(result["success"]) self.assertIn("token", result["output"])
def test_run_testset_output(self): testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_layer.yml') result = HttpRunner(testcase_file_path).run() self.assertTrue(result["success"]) self.assertIn("token", result["output"][0]["out"]) self.assertEqual(len(result["output"]), 13)
def test_run_testcases(self): runner = HttpRunner().run(self.testcases) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 2) self.assertIn("details", summary) self.assertIn("records", summary["details"][0])
def test_parse_tests(self): testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testcase.yml') runner = HttpRunner() testcases = runner.load_tests(testcase_file_path) parsed_testcases = runner.parse_tests(testcases) self.assertEqual(parsed_testcases[0]["config"]["variables"]["var_c"], 3) self.assertEqual(len(parsed_testcases), 2 * 2) self.assertEqual(parsed_testcases[0]["config"]["request"]["base_url"], '$BASE_URL') self.assertEqual( parsed_testcases[0]["config"]["variables"]["BASE_URL"], 'http://127.0.0.1:5000') self.assertIsInstance(parsed_testcases, list) self.assertEqual(parsed_testcases[0]["config"]["name"], '12311')
def test_run_post_data(self): testcases = [{ "name": "post data", "teststeps": [{ "name": "post data", "request": { "url": "{}/post".format(HTTPBIN_SERVER), "method": "POST", "headers": { "Content-Type": "application/json" }, "data": "abc" }, "validate": [{ "eq": ["status_code", 200] }] }] }] runner = HttpRunner().run(testcases) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 1) self.assertEqual( summary["details"][0]["records"][0]["meta_data"]["response"] ["json"]["data"], "abc")
def run_test(request): if request.session.get('login_status'): kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) if request.method == 'POST': mode = request.POST.get('mode') id = request.POST.get('id') if mode == 'run_by_test': test = run_by_single(id) runner.run(test) return render_to_response('report_template.html', runner.summary) else: return HttpResponseRedirect("/api/login/")
def test_run_yaml_upload(self): testset_path = "tests/httpbin/upload.yml" runner = HttpRunner().run(testset_path) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 1) self.assertIn("records", summary)
def test_run_testset(self): testsets = self.testset runner = HttpRunner().run(testsets) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 2) self.assertIn("records", summary)
def run_test(request): print("!!!用例开始运行!!!") print(request.body) print(request.path) print(request.encoding) print(request.method) print(request.META.get("CONTENT_TYPE")) print("请求来源:",request.META.get("REMOTE_ADDR")) """ 运行用例 :param request: :return: """ kwargs = { "failfast": False, } runner = HttpRunner(**kwargs) testcase_dir_path = os.path.join(os.getcwd(), "suite") testcase_dir_path = os.path.join(testcase_dir_path, get_time_stamp()) if request.is_ajax(): kwargs = json.loads(request.body.decode('utf-8')) id = kwargs.pop('id') base_url = kwargs.pop('env_name') type = kwargs.pop('type') run_test_by_type(id, base_url, testcase_dir_path, type) report_name = kwargs.get('report_name', None) main_hrun.delay(testcase_dir_path, report_name) return HttpResponse('用例执行中,请稍后查看报告即可,默认时间戳命名报告') else: id = request.POST.get('id') base_url = request.POST.get('env_name') type = request.POST.get('type', 'test') print(id,base_url,type) run_test_by_type(id, base_url, testcase_dir_path, type) t1 = runner.run(testcase_dir_path) print("用例执行结果",t1.gen_html_report()) shutil.rmtree(testcase_dir_path) runner.summary = timestamp_to_datetime(runner.summary, type=False) #修复BUG一,测试完成后report没有落库,可能是没有调用此方法,补充如下: report_name = kwargs.get('report_name', None) add_test_reports(runner, report_name=report_name) return render_to_response('report_template.html', runner.summary)
def test_run_testset_with_parameters(self): testcase_file_path = os.path.join( os.getcwd(), 'tests/data/demo_parameters.yml') runner = HttpRunner().run(testcase_file_path) summary = runner.summary self.assertTrue(summary["success"]) self.assertEqual(len(summary["output"]), 3 * 2 * 2) self.assertEqual(summary["stat"]["testsRun"], 3 * 2 * 2)
def test_run_testset_output(self): testcase_file_path = os.path.join( os.getcwd(), 'tests/data/demo_testset_layer.yml') runner = HttpRunner().run(testcase_file_path) summary = runner.summary self.assertTrue(summary["success"]) self.assertIn("token", summary["output"][0]["out"]) self.assertEqual(len(summary["output"]), 13)