From ec2058f2e29cb470993918962c30f890c68b9baf Mon Sep 17 00:00:00 2001 From: debugtalk Date: Fri, 31 Aug 2018 14:32:10 +0800 Subject: [PATCH] fix #366: teststep name --- httprunner/api.py | 33 +++++++++++++++++++++++++++--- httprunner/loader.py | 20 +++++++++--------- httprunner/runner.py | 2 +- httprunner/utils.py | 18 ----------------- tests/data/demo_parameters.yml | 2 +- tests/test_api.py | 37 ++++++++++++++++++++++++++++++++-- 6 files changed, 78 insertions(+), 34 deletions(-) diff --git a/httprunner/api.py b/httprunner/api.py index 02bf9337..1a67d76a 100644 --- a/httprunner/api.py +++ b/httprunner/api.py @@ -35,6 +35,7 @@ class HttpRunner(object): } """ + loader.reset_loader() loader.dot_env_path = kwargs.pop("dot_env_path", None) self.http_client_session = kwargs.pop("http_client_session", None) self.kwargs = kwargs @@ -173,7 +174,7 @@ class HttpRunner(object): return parsed_testcases_list - def __initialize(self, testcases): + def initialize(self, testcases): """ initialize test runner with parsed testcases. Args: @@ -183,6 +184,32 @@ class HttpRunner(object): tuple: (unittest.TextTestRunner(), unittest.TestSuite()) """ + def __add_teststep(test_runner, config, teststep_dict): + """ add teststep to testcase. + """ + def test(self): + try: + test_runner.run_test(teststep_dict) + except exceptions.MyBaseFailure as ex: + self.fail(str(ex)) + finally: + if hasattr(test_runner.http_client_session, "meta_data"): + self.meta_data = test_runner.http_client_session.meta_data + self.meta_data["validators"] = test_runner.evaluated_validators + test_runner.http_client_session.init_meta_data() + + try: + teststep_dict["name"] = parser.parse_data( + teststep_dict["name"], + config.get("variables", {}), + config.get("functions", {}) + ) + except exceptions.VariableNotFound: + pass + + test.__doc__ = teststep_dict["name"] + return test + self.kwargs.setdefault("resultclass", report.HtmlTestResult) unittest_runner = unittest.TextTestRunner(**self.kwargs) @@ -200,7 +227,7 @@ class HttpRunner(object): # suppose one testcase should not have more than 9999 steps, # and one step should not run more than 999 times. test_method_name = 'test_{:04}_{:03}'.format(index, times_index) - test_method = utils.add_teststep(test_runner, teststep_dict) + test_method = __add_teststep(test_runner, config, teststep_dict) setattr(TestSequense, test_method_name, test_method) loaded_testcase = loader.loadTestsFromTestCase(TestSequense) @@ -240,7 +267,7 @@ class HttpRunner(object): parsed_testcases_list = self.parse_tests(testcases_list) # initialize - unittest_runner, test_suite = self.__initialize(parsed_testcases_list) + unittest_runner, test_suite = self.initialize(parsed_testcases_list) # aggregate self.summary = { diff --git a/httprunner/loader.py b/httprunner/loader.py index f4c709ec..69ffb362 100644 --- a/httprunner/loader.py +++ b/httprunner/loader.py @@ -25,7 +25,6 @@ project_mapping = { """ dot_env_path = None - testcases_cache_mapping = {} project_working_directory = os.getcwd() @@ -852,6 +851,9 @@ def reset_loader(): global project_working_directory project_working_directory = os.getcwd() + global dot_env_path + dot_env_path = None + project_mapping["debugtalk"] = { "variables": {}, "functions": {} @@ -937,20 +939,25 @@ def load_testcases(path): return testcases_list + if not os.path.exists(path): + err_msg = "path not exist: {}".format(path) + logger.log_error(err_msg) + raise exceptions.FileNotFound(err_msg) + if not os.path.isabs(path): path = os.path.join(os.getcwd(), path) - if path in testcases_cache_mapping: + if path not in testcases_cache_mapping: + load_project_tests(path) + else: return testcases_cache_mapping[path] if os.path.isdir(path): - load_project_tests(path) files_list = load_folder_files(path) testcases_list = load_testcases(files_list) elif os.path.isfile(path): try: - load_project_tests(path) testcase = _load_test_file(path) if testcase["teststeps"]: testcases_list = [testcase] @@ -959,10 +966,5 @@ def load_testcases(path): except exceptions.FileFormatError: testcases_list = [] - else: - err_msg = "path not exist: {}".format(path) - logger.log_error(err_msg) - raise exceptions.FileNotFound(err_msg) - testcases_cache_mapping[path] = testcases_list return testcases_list diff --git a/httprunner/runner.py b/httprunner/runner.py index 16271b4d..50c6220c 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -102,7 +102,7 @@ class Runner(object): SkipTest: skip teststep """ - # TODO: move skip to __initialize + # TODO: move skip to initialize skip_reason = None if "skip" in teststep_dict: diff --git a/httprunner/utils.py b/httprunner/utils.py index 1b037ec3..1982c863 100644 --- a/httprunner/utils.py +++ b/httprunner/utils.py @@ -256,24 +256,6 @@ def override_mapping_list(variables, new_mapping): ) -def add_teststep(test_runner, teststep_dict): - """ add teststep to testcase. - """ - def test(self): - try: - test_runner.run_test(teststep_dict) - except exceptions.MyBaseFailure as ex: - self.fail(str(ex)) - finally: - if hasattr(test_runner.http_client_session, "meta_data"): - self.meta_data = test_runner.http_client_session.meta_data - self.meta_data["validators"] = test_runner.evaluated_validators - test_runner.http_client_session.init_meta_data() - - test.__doc__ = teststep_dict["name"] - return test - - def get_testcase_io(testcase): """ get testcase input(variables) and output. diff --git a/tests/data/demo_parameters.yml b/tests/data/demo_parameters.yml index 7726944b..1ede18f8 100644 --- a/tests/data/demo_parameters.yml +++ b/tests/data/demo_parameters.yml @@ -18,7 +18,7 @@ - token - test: - name: get token with $user_agent and $app_version + name: get token with $user_agent and $username api: get_token($user_agent, $device_sn, $os_platform, $app_version) extract: - token: content.token diff --git a/tests/test_api.py b/tests/test_api.py index fcb7feaa..5af4349c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -266,12 +266,12 @@ class TestHttpRunner(ApiServerUnittest): self.assertFalse(summary["success"]) self.assertEqual(summary["stat"]["errors"], 1) - def test_run_testset_hardcode(self): + def test_run_testcase_hardcode(self): for testcase_file_path in self.testcase_file_path_list: runner = HttpRunner().run(testcase_file_path) self.assertTrue(runner.summary["success"]) - def test_run_testsets_hardcode(self): + def test_run_testcases_hardcode(self): runner = HttpRunner().run(self.testcase_file_path_list) summary = runner.summary self.assertTrue(summary["success"]) @@ -344,6 +344,39 @@ class TestHttpRunner(ApiServerUnittest): self.assertIn("in", summary["details"][0]["in_out"]) self.assertIn("out", summary["details"][0]["in_out"]) + def test_run_testcase_with_parameters_name(self): + testcase_file_path = os.path.join( + os.getcwd(), 'tests/data/demo_parameters.yml') + runner = HttpRunner() + testcases = runner.load_tests(testcase_file_path) + parsed_testcases = runner.parse_tests(testcases) + unittest_runner, test_suite = runner.initialize(parsed_testcases) + + self.assertEqual( + test_suite._tests[0].teststeps[0]['name'], + 'get token with iOS/10.1 and test1' + ) + self.assertEqual( + test_suite._tests[1].teststeps[0]['name'], + 'get token with iOS/10.1 and test2' + ) + self.assertEqual( + test_suite._tests[2].teststeps[0]['name'], + 'get token with iOS/10.2 and test1' + ) + self.assertEqual( + test_suite._tests[3].teststeps[0]['name'], + 'get token with iOS/10.2 and test2' + ) + self.assertEqual( + test_suite._tests[4].teststeps[0]['name'], + 'get token with iOS/10.3 and test1' + ) + self.assertEqual( + test_suite._tests[5].teststeps[0]['name'], + 'get token with iOS/10.3 and test2' + ) + def test_load_tests(self): testcase_file_path = os.path.join( os.getcwd(), 'tests/data/demo_testcase.yml')