diff --git a/httprunner/loader.py b/httprunner/loader.py index 24106311..700f7582 100644 --- a/httprunner/loader.py +++ b/httprunner/loader.py @@ -933,10 +933,9 @@ def load_project_tests(test_path, dot_env_path=None): "functions": {} } - # TODO: add tests layer temporally, remove later. - project_mapping["def-api"] = load_api_folder(os.path.join(project_working_directory, "tests", "api")) + project_mapping["def-api"] = load_api_folder(os.path.join(project_working_directory, "api")) # TODO: replace suite with testcases - project_mapping["def-testcase"] = load_test_folder(os.path.join(project_working_directory, "tests", "suite")) + project_mapping["def-testcase"] = load_test_folder(os.path.join(project_working_directory, "suite")) return project_mapping diff --git a/httprunner/parser.py b/httprunner/parser.py index 6c22c7e3..481ddc9d 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -629,24 +629,29 @@ def parse_tests(testcases, variables_mapping=None): for parameter_mapping in cartesian_product_parameters_list: testcase_dict = utils.deepcopy_dict(testcase) config = testcase_dict.get("config") - - # parse config variables + # get config variables raw_config_variables = config.get("variables", []) - parsed_config_variables = parse_data( - raw_config_variables, - project_mapping["debugtalk"]["variables"], - project_mapping["debugtalk"]["functions"] - ) + raw_config_variables_mapping = utils.ensure_mapping_format(raw_config_variables) - # priority: passed in > debugtalk.py > parameters > variables - # override variables mapping with parameters mapping - config_variables = utils.override_mapping_list( - parsed_config_variables, parameter_mapping) - # merge debugtalk.py module variables + # priority: passed in > .env > debugtalk.py > parameters > variables + + config_variables = utils.deepcopy_dict(parameter_mapping) config_variables.update(project_mapping["debugtalk"]["variables"]) - # override variables mapping with passed in variables_mapping - config_variables = utils.override_mapping_list( - config_variables, variables_mapping) + config_variables.update(variables_mapping) + + for key, value in raw_config_variables_mapping.items(): + + if key in config_variables: + # passed in & .env & parameters + continue + else: + # config variables + parsed_value = parse_data( + value, + config_variables, + project_mapping["debugtalk"]["functions"] + ) + config_variables[key] = parsed_value testcase_dict["config"]["variables"] = config_variables diff --git a/httprunner/utils.py b/httprunner/utils.py index 8bf7700e..78e14c64 100644 --- a/httprunner/utils.py +++ b/httprunner/utils.py @@ -264,6 +264,39 @@ def update_ordered_dict(ordered_dict, override_mapping): return new_ordered_dict +def ensure_mapping_format(variables): + """ ensure variables are in mapping format. + + Args: + variables (list/dict/OrderedDict): original variables + + Returns: + OrderedDict: ensured variables in OrderedDict + + Examples: + >>> variables = [ + {"a": 1}, + {"b": 2} + ] + >>> print(ensure_mapping_format(variables)) + OrderDict( + { + "a": 1, + "b": 2 + } + ) + + """ + if isinstance(variables, list): + variables_ordered_dict = convert_mappinglist_to_orderdict(variables) + elif isinstance(variables, (OrderedDict, dict)): + variables_ordered_dict = variables + else: + raise exceptions.ParamsError("variables format error!") + + return variables_ordered_dict + + def override_mapping_list(variables, new_mapping): """ override variables with new mapping. @@ -298,12 +331,7 @@ def override_mapping_list(variables, new_mapping): ) """ - if isinstance(variables, list): - variables_ordered_dict = convert_mappinglist_to_orderdict(variables) - elif isinstance(variables, (OrderedDict, dict)): - variables_ordered_dict = variables - else: - raise exceptions.ParamsError("variables error!") + variables_ordered_dict = ensure_mapping_format(variables) return update_ordered_dict( variables_ordered_dict, diff --git a/tests/test_loader.py b/tests/test_loader.py index 77a23a1a..104a855c 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -565,7 +565,7 @@ class TestSuiteLoader(unittest.TestCase): path = os.path.join( os.getcwd(), 'tests/data/demo_locust.yml') locust_tests = loader.load_locust_tests(path) - self.assertEqual(locust_tests["config"]["refs"]["env"]["UserName"], "debugtalk") + self.assertEqual(locust_tests["config"]["variables"]["UserName"], "debugtalk") self.assertEqual(len(locust_tests["tests"]), 10) self.assertEqual(locust_tests["tests"][0][0]["name"], "index") self.assertEqual(locust_tests["tests"][9][0]["name"], "user-agent")