From 94464c323a0148b2528bc961ea24fdb3aff8666c Mon Sep 17 00:00:00 2001 From: debugtalk Date: Mon, 17 Dec 2018 20:16:52 +0800 Subject: [PATCH] update parameterize feature: def get_user_agent(): return ["iOS/10.1", "iOS/10.2"] def get_account_in_tuple(): return [("user1", "111111"), ("user2", "222222")] --- httprunner/parser.py | 31 ++++++++++++++++++++++++------- tests/debugtalk.py | 6 ++++++ tests/test_parser.py | 17 +++++++++++++++-- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/httprunner/parser.py b/httprunner/parser.py index f9dd84d0..898e4cca 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -315,16 +315,33 @@ def parse_parameters(parameters, variables_mapping=None, functions_mapping=None) else: # (2) & (3) parsed_parameter_content = parse_data(parameter_content, variables_mapping, functions_mapping) - # e.g. [{'app_version': '2.8.5'}, {'app_version': '2.8.6'}] - # e.g. [{"username": "user1", "password": "111111"}, {"username": "user2", "password": "222222"}] if not isinstance(parsed_parameter_content, list): raise exceptions.ParamsError("parameters syntax error!") - parameter_content_list = [ - # get subset by parameter name - {key: parameter_item[key] for key in parameter_name_list} - for parameter_item in parsed_parameter_content - ] + parameter_content_list = [] + for parameter_item in parsed_parameter_content: + if isinstance(parameter_item, dict): + # get subset by parameter name + # {"app_version": "${gen_app_version()}"} + # gen_app_version() => [{'app_version': '2.8.5'}, {'app_version': '2.8.6'}] + # {"username-password": "${get_account()}"} + # get_account() => [ + # {"username": "user1", "password": "111111"}, + # {"username": "user2", "password": "222222"} + # ] + parameter_dict = {key: parameter_item[key] for key in parameter_name_list} + elif isinstance(parameter_item, (list, tuple)): + # {"username-password": "${get_account()}"} + # get_account() => [("user1", "111111"), ("user2", "222222")] + parameter_dict = dict(zip(parameter_name_list, parameter_item)) + elif len(parameter_name_list) == 1: + # {"user_agent": "${get_user_agent()}"} + # get_user_agent() => ["iOS/10.1", "iOS/10.2"] + parameter_dict = { + parameter_name_list[0]: parameter_item + } + + parameter_content_list.append(parameter_dict) parsed_parameters_list.append(parameter_content_list) diff --git a/tests/debugtalk.py b/tests/debugtalk.py index 19b3e6e3..87a7ee8b 100644 --- a/tests/debugtalk.py +++ b/tests/debugtalk.py @@ -45,6 +45,9 @@ def skip_test_in_production_env(): """ return os.environ["TEST_ENV"] == "PRODUCTION" +def get_user_agent(): + return ["iOS/10.1", "iOS/10.2"] + def gen_app_version(): return [ {"app_version": "2.8.5"}, @@ -57,6 +60,9 @@ def get_account(): {"username": "user2", "password": "222222"} ] +def get_account_in_tuple(): + return [("user1", "111111"), ("user2", "222222")] + def gen_random_string(str_len): random_char_list = [] for _ in range(str_len): diff --git a/tests/test_parser.py b/tests/test_parser.py index 5100116e..98b30f1f 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -376,8 +376,10 @@ class TestParser(unittest.TestCase): def test_parse_parameters_custom_function(self): parameters = [ + {"user_agent": "${get_user_agent()}"}, {"app_version": "${gen_app_version()}"}, - {"username-password": "${get_account()}"} + {"username-password": "${get_account()}"}, + {"username2-password2": "${get_account_in_tuple()}"} ] dot_env_path = os.path.join( os.getcwd(), "tests", ".env" @@ -388,9 +390,20 @@ class TestParser(unittest.TestCase): parameters, functions_mapping=loader.load_module_functions(debugtalk) ) + self.assertIn( + { + 'user_agent': 'iOS/10.1', + 'app_version': '2.8.5', + 'username': 'user1', + 'password': '111111', + 'username2': 'user1', + 'password2': '111111' + }, + cartesian_product_parameters + ) self.assertEqual( len(cartesian_product_parameters), - 2 * 2 + 2 * 2 * 2 * 2 ) def test_parse_parameters_parameterize(self):