From 8d511ceb1648344090d57603b79c096a5a773ec2 Mon Sep 17 00:00:00 2001 From: hluguoj Date: Thu, 21 Feb 2019 20:13:53 +0800 Subject: [PATCH] bugfix random function in config variables run many times --- httprunner/parser.py | 36 +++++++++++++++++++++---------- tests/data/demo_testcase.yml | 2 ++ tests/test_api.py | 3 +++ tests/test_loader.py | 4 ++-- tests/test_parser.py | 15 +++++++++---- tests/testsuites/create_users.yml | 6 ++++++ 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/httprunner/parser.py b/httprunner/parser.py index 94d7d822..d2a31b97 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -506,7 +506,7 @@ def parse_string_variables(content, variables_mapping, functions_mapping): functions_mapping, raise_if_variable_not_found=False ) - + variables_mapping[variable_name] = parsed_variable_value # TODO: replace variable label from $var to {{var}} if "${}".format(variable_name) == content: # content is a variable @@ -759,13 +759,15 @@ def __parse_config(config, project_mapping): # parse config variables parsed_config_variables = {} - for key, value in raw_config_variables_mapping.items(): + + for key in raw_config_variables_mapping: parsed_value = parse_data( - value, + raw_config_variables_mapping[key], raw_config_variables_mapping, functions, raise_if_variable_not_found=False ) + raw_config_variables_mapping[key] = parsed_value parsed_config_variables[key] = parsed_value if parsed_config_variables: @@ -823,12 +825,22 @@ def __parse_testcase_tests(tests, config, project_mapping): test_dict.pop("variables", {}), config_variables ) - test_dict["variables"] = parse_data( - test_dict["variables"], - test_dict["variables"], - functions, - raise_if_variable_not_found=False - ) + + for key in test_dict["variables"]: + parsed_key = parse_data( + key, + test_dict["variables"], + functions, + raise_if_variable_not_found=False + ) + parsed_value = parse_data( + test_dict["variables"][key], + test_dict["variables"], + functions, + raise_if_variable_not_found=False + ) + if parsed_key in test_dict["variables"]: + test_dict["variables"][parsed_key] = parsed_value # parse test_dict name test_dict["name"] = parse_data( @@ -974,15 +986,17 @@ def __get_parsed_testsuite_testcases(testcases, testsuite_config, project_mappin # parse config variables parsed_config_variables = {} - for key, value in parsed_testcase_config_variables.items(): + + for key in parsed_testcase_config_variables: try: parsed_value = parse_data( - value, + parsed_testcase_config_variables[key], parsed_testcase_config_variables, functions ) except exceptions.VariableNotFound: pass + parsed_testcase_config_variables[key] = parsed_value parsed_config_variables[key] = parsed_value if parsed_config_variables: diff --git a/tests/data/demo_testcase.yml b/tests/data/demo_testcase.yml index f268403a..d4f2f178 100644 --- a/tests/data/demo_testcase.yml +++ b/tests/data/demo_testcase.yml @@ -3,6 +3,8 @@ variables: var_a: 0 var_c: "${sum_two(1, 2)}" + var_d: "${gen_random_string(5)}" + var_e: $var_d PROJECT_KEY: ${ENV(PROJECT_KEY)} # parameters: # - "var_a-var_b": diff --git a/tests/test_api.py b/tests/test_api.py index 4915dcd1..6474dd75 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -598,6 +598,9 @@ class TestApi(ApiServerUnittest): testcase1 = parsed_testcases[0]["teststeps"][0] self.assertIn("setup and reset all (override)", testcase1["config"]["name"]) + self.assertEqual(testcase1["teststeps"][0]["variables"]["var_c"], testcase1["teststeps"][0]["variables"]["var_d"]) + self.assertEqual(testcase1["teststeps"][0]["variables"]["var_a"], testcase1["teststeps"][0]["variables"]["var_b"]) + self.assertNotEqual(testcase1["teststeps"][0]["variables"]["var_a"], testcase1["teststeps"][0]["variables"]["var_c"]) self.assertNotIn("testcase_def", testcase1) self.assertEqual(len(testcase1["teststeps"]), 2) self.assertEqual( diff --git a/tests/test_loader.py b/tests/test_loader.py index f8f3a204..10d79cdf 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -394,8 +394,8 @@ class TestSuiteLoader(unittest.TestCase): testsuites_list[0]["config"]["name"] ) self.assertEqual( - {'device_sn': '${gen_random_string(15)}'}, - testsuites_list[0]["config"]["variables"] + '${gen_random_string(15)}', + testsuites_list[0]["config"]["variables"]['device_sn'] ) self.assertIn( "create user 1000 and check result.", diff --git a/tests/test_parser.py b/tests/test_parser.py index 8f97ea30..b81a6e11 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -452,6 +452,7 @@ class TestParser(unittest.TestCase): test_dict1 = parsed_testcases[0]["teststeps"][0] self.assertEqual(test_dict1["variables"]["var_c"], 3) self.assertEqual(test_dict1["variables"]["PROJECT_KEY"], "ABCDEFGH") + self.assertEqual(test_dict1["variables"]["var_d"], test_dict1["variables"]["var_e"]) # TODO: parameters # self.assertEqual(len(parsed_testcases), 2 * 2) self.assertEqual(parsed_testcases[0]["config"]["name"], '1230') @@ -612,11 +613,12 @@ class TestParser(unittest.TestCase): self.assertEqual(parsed_testcase["num4"], "${sum_two($num0, 5)}") def test_parse_tests_variable_with_function(self): - from tests.debugtalk import sum_two + from tests.debugtalk import sum_two, gen_random_string tests_mapping = { "project_mapping": { "functions": { - "sum_two": sum_two + "sum_two": sum_two, + "gen_random_string": gen_random_string } }, 'testcases': [ @@ -625,7 +627,9 @@ class TestParser(unittest.TestCase): 'name': '', "base_url": "$host1", 'variables': { - "host1": "https://debugtalk.com" + "host1": "https://debugtalk.com", + "var_a": "${gen_random_string(5)}", + "var_b": "$var_a" } }, "teststeps": [ @@ -636,7 +640,9 @@ class TestParser(unittest.TestCase): "host2": "https://httprunner.org", "num3": "${sum_two($num2, 4)}", "num2": "${sum_two($num1, 3)}", - "num1": "${sum_two(1, 2)}" + "num1": "${sum_two(1, 2)}", + "str1": "${gen_random_string(5)}", + "str2": "$str1" }, 'request': { 'url': '/api1/?num1=$num1&num2=$num2&num3=$num3', @@ -651,6 +657,7 @@ class TestParser(unittest.TestCase): test_dict = parsed_tests_mapping["testcases"][0]["teststeps"][0] self.assertEqual(test_dict["variables"]["num3"], 10) self.assertEqual(test_dict["variables"]["num2"], 6) + self.assertEqual(test_dict["variables"]["str1"], test_dict["variables"]["str2"]) self.assertEqual( test_dict["request"]["url"], "https://httprunner.org/api1/?num1=3&num2=6&num3=10" diff --git a/tests/testsuites/create_users.yml b/tests/testsuites/create_users.yml index ca5d1eff..8d67996c 100644 --- a/tests/testsuites/create_users.yml +++ b/tests/testsuites/create_users.yml @@ -2,6 +2,8 @@ config: name: create users with uid variables: device_sn: ${gen_random_string(15)} + var_a: ${gen_random_string(5)} + var_b: $var_a base_url: "http://127.0.0.1:5000" testcases: @@ -9,8 +11,12 @@ testcases: testcase: testcases/create_and_check.yml variables: uid: 1000 + var_c: ${gen_random_string(5)} + var_d: $var_c create user 1001 and check result.: testcase: testcases/create_and_check.yml variables: uid: 1001 + var_c: ${gen_random_string(5)} + var_d: $var_c