From 173594a20109304b8a1e464ebda0a0fd99c93de4 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Wed, 28 Nov 2018 13:18:27 +0800 Subject: [PATCH] fix a4ce29e656897c93db490d4cb47ee64343030870: make variables independent on order --- httprunner/context.py | 23 ++++++++++++---------- httprunner/parser.py | 12 ------------ httprunner/utils.py | 8 +++++--- tests/test_context.py | 44 +++++++++++++++++++++++++++++++------------ tests/test_parser.py | 4 ++-- 5 files changed, 52 insertions(+), 39 deletions(-) diff --git a/httprunner/context.py b/httprunner/context.py index aa06663e..cec6e96f 100644 --- a/httprunner/context.py +++ b/httprunner/context.py @@ -24,20 +24,23 @@ class SessionContext(object): variables_mapping will be evaluated first. Args: - variables_mapping (dict/list) - [ - {"TOKEN": "debugtalk"}, - {"random": "${gen_random_string(5)}"}, - {"data": '{"name": "user", "password": "123456"}'}, - {"authorization": "${gen_md5($TOKEN, $data, $random)}"} - ] + variables_mapping (dict) + { + "random": "${gen_random_string(5)}", + "authorization": "${gen_md5($TOKEN, $data, $random)}", + "data": '{"name": "user", "password": "123456"}', + "TOKEN": "debugtalk", + } """ - self.test_variables_mapping = {} - self.test_variables_mapping.update(self.session_variables_mapping) - variables_mapping = variables_mapping or {} variables_mapping = utils.ensure_mapping_format(variables_mapping) + + self.test_variables_mapping = {} + # priority: extracted variable > teststep variable + self.test_variables_mapping.update(variables_mapping) + self.test_variables_mapping.update(self.session_variables_mapping) + for variable_name, variable_value in variables_mapping.items(): variable_value = self.eval_content(variable_value) self.update_test_variables(variable_name, variable_value) diff --git a/httprunner/parser.py b/httprunner/parser.py index 419ad3e4..7550ba31 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -767,12 +767,6 @@ def __parse_tests(tests, config, project_mapping): test_dict.pop("variables", {}), config_variables ) - # parse test variables with config variables - test_dict["variables"] = parse_data( - test_dict["variables"], - test_dict["variables"], - functions - ) # parse test_dict name try: @@ -802,12 +796,6 @@ def __parse_tests(tests, config, project_mapping): test_dict.pop("variables", {}), config_variables ) - # parse test variables with config variables - test_dict["variables"] = parse_data( - test_dict["variables"], - test_dict["variables"], - functions - ) # parse test_dict name try: diff --git a/httprunner/utils.py b/httprunner/utils.py index fcc5df2a..0ce59dfd 100644 --- a/httprunner/utils.py +++ b/httprunner/utils.py @@ -286,13 +286,15 @@ def ensure_mapping_format(variables): variables_ordered_dict = {} for map_dict in variables: variables_ordered_dict.update(map_dict) + + return variables_ordered_dict + elif isinstance(variables, dict): - variables_ordered_dict = variables + return variables + else: raise exceptions.ParamsError("variables format error!") - return variables_ordered_dict - def _convert_validators_to_mapping(validators): """ convert validators list to mapping. diff --git a/tests/test_context.py b/tests/test_context.py index d61f186a..e360ea0d 100644 --- a/tests/test_context.py +++ b/tests/test_context.py @@ -22,12 +22,27 @@ class TestContext(ApiServerUnittest): context_functions = self.context.FUNCTIONS_MAPPING self.assertIn("gen_md5", context_functions) - def test_init_test_variables(self): + def test_init_test_variables_initialize(self): self.assertEqual( self.context.test_variables_mapping, {'SECRET_KEY': 'DebugTalk'} ) + def test_init_test_variables(self): + variables = { + "random": "${gen_random_string($num)}", + "authorization": "${gen_md5($TOKEN, $data, $random)}", + "data": '{"name": "$username", "password": "123456"}', + "TOKEN": "debugtalk", + "username": "user1", + "num": 6 + } + self.context.init_test_variables(variables) + variables_mapping = self.context.test_variables_mapping + self.assertEqual(len(variables_mapping["random"]), 6) + self.assertEqual(len(variables_mapping["authorization"]), 32) + self.assertEqual(variables_mapping["data"], '{"name": "user1", "password": "123456"}') + def test_update_seesion_variables(self): self.context.update_seesion_variables({"TOKEN": "debugtalk"}) self.assertEqual( @@ -57,12 +72,13 @@ class TestContext(ApiServerUnittest): # ) def test_get_parsed_request(self): - variables = [ - {"TOKEN": "debugtalk"}, - {"random": "${gen_random_string(5)}"}, - {"data": '{"name": "user", "password": "123456"}'}, - {"authorization": "${gen_md5($TOKEN, $data, $random)}"} - ] + variables = { + "random": "${gen_random_string(5)}", + "data": '{"name": "user", "password": "123456"}', + "authorization": "${gen_md5($TOKEN, $data, $random)}", + "TOKEN": "debugtalk" + } + self.context.init_test_variables(variables) request = { @@ -82,7 +98,10 @@ class TestContext(ApiServerUnittest): self.assertIn("random", parsed_request["headers"]) self.assertEqual(len(parsed_request["headers"]["random"]), 5) self.assertIn("data", parsed_request) - self.assertEqual(parsed_request["data"], variables[2]["data"]) + self.assertEqual( + parsed_request["data"], + '{"name": "user", "password": "123456"}' + ) self.assertEqual(parsed_request["headers"]["secret_key"], "DebugTalk") def test_do_validation(self): @@ -106,10 +125,11 @@ class TestContext(ApiServerUnittest): {"check": "$resp_status_code", "comparator": "eq", "expect": 201}, {"check": "$resp_body_success", "comparator": "eq", "expect": True} ] - variables = [ - {"resp_status_code": 200}, - {"resp_body_success": True} - ] + variables = { + "resp_status_code": 200, + "resp_body_success": True + } + self.context.init_test_variables(variables) with self.assertRaises(exceptions.ValidationFailure): diff --git a/tests/test_parser.py b/tests/test_parser.py index 6d0e84e6..4490f8ff 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -452,7 +452,7 @@ class TestParser(unittest.TestCase): # self.assertEqual(len(parsed_testcases), 2 * 2) self.assertEqual(parsed_testcases[0]["config"]["name"], '1230') - def test_parse_tests_fix_override_variables(self): + def test_parse_tests_override_variables(self): tests_mapping = { 'testcases': [ { @@ -479,7 +479,7 @@ class TestParser(unittest.TestCase): parser.parse_tests(tests_mapping) test_dict1_variables = tests_mapping["testcases"][0]["tests"][0]["variables"] self.assertEqual(test_dict1_variables["creator"], "user_test_001") - self.assertEqual(test_dict1_variables["username"], "user_test_001") + self.assertEqual(test_dict1_variables["username"], "$creator") def test_parse_environ(self): os.environ["PROJECT_KEY"] = "ABCDEFGH"