From 8e67466f019ef775f5dc5ef0a6a387ff02437a48 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Thu, 9 Aug 2018 16:31:44 +0800 Subject: [PATCH] add load_api_folder --- httprunner/loader.py | 97 ++++++++++++++++++++++++++++++++++++++++++-- tests/test_loader.py | 14 +++++++ 2 files changed, 107 insertions(+), 4 deletions(-) diff --git a/httprunner/loader.py b/httprunner/loader.py index c1728bc0..1d5b2900 100644 --- a/httprunner/loader.py +++ b/httprunner/loader.py @@ -102,10 +102,14 @@ def load_file(file_path): def load_folder_files(folder_path, recursive=True): - """ load folder path, return all files in list format. - @param - folder_path: specified folder path to load - recursive: if True, will load files recursively + """ load folder path, return all files endswith yml/yaml/json in list. + + Args: + folder_path (str): specified folder path to load + recursive (bool): load files recursively if True + + Returns: + list: files endswith yml/yaml/json """ if isinstance(folder_path, (list, set)): files = [] @@ -735,6 +739,91 @@ def load_testcases(path): return testcases_list +def load_folder_content(folder_path): + """ load api/testcases/testsuites definitions from folder. + + Args: + folder_path (str): api/testcases/testsuites files folder. + + Returns: + dict: api definition mapping. + + { + "tests/api/basic.yml": [ + {"api": {"def": "api_login", "request": {}, "validate": []}}, + {"api": {"def": "api_logout", "request": {}, "validate": []}} + ] + } + """ + items_mapping = {} + + for file_path in load_folder_files(folder_path): + items_mapping[file_path] = load_file(file_path) + + return items_mapping + + +def load_api_folder(api_folder_path=None): + """ load api definitions from api folder. + + Args: + api_folder_path (str): api files folder. + + api file should be in the following format: + [ + { + "api": { + "def": "api_login", + "request": {}, + "validate": [] + } + }, + { + "api": { + "def": "api_logout", + "request": {}, + "validate": [] + } + } + ] + + Returns: + dict: api definition mapping. + + { + "api_login": { + "function_meta": {"func_name": "api_login", "args": [], "kwargs": {}} + "request": {} + }, + "api_logout": { + "function_meta": {"func_name": "api_logout", "args": [], "kwargs": {}} + "request": {} + } + } + """ + api_definition_mapping = {} + + api_folder_path = api_folder_path or os.path.join(os.getcwd(), "api") + api_items_mapping = load_folder_content(api_folder_path) + + for api_file_path, api_items in api_items_mapping.items(): + # TODO: add JSON schema validation + for api_item in api_items: + key, api_dict = api_item.popitem() + + api_def = api_dict.pop("def") + function_meta = parser.parse_function(api_def) + func_name = function_meta["func_name"] + + if func_name in api_definition_mapping: + logger.log_warning("API definition duplicated: {}".format(func_name)) + + api_dict["function_meta"] = function_meta + api_definition_mapping[func_name] = api_dict + + return api_definition_mapping + + def load(path): """ main interface for loading testcases diff --git a/tests/test_loader.py b/tests/test_loader.py index f004dd52..9ba0961e 100644 --- a/tests/test_loader.py +++ b/tests/test_loader.py @@ -456,3 +456,17 @@ class TestSuiteLoader(unittest.TestCase): self.assertIn("request", testsets_list[0]["testcases"][0]) self.assertIn("url", testsets_list[0]["testcases"][0]["request"]) self.assertIn("validate", testsets_list[0]["testcases"][0]) + + def test_load_folder_content(self): + path = os.path.join(os.getcwd(), "tests", "api") + items_mapping = loader.load_folder_content(path) + file_path = os.path.join(os.getcwd(), "tests", "api", "basic.yml") + self.assertIn(file_path, items_mapping) + self.assertIsInstance(items_mapping[file_path], list) + + def test_load_api_folder(self): + path = os.path.join(os.getcwd(), "tests", "api") + api_definition_mapping = loader.load_api_folder(path) + self.assertIn("get_token", api_definition_mapping) + self.assertIn("request", api_definition_mapping["get_token"]) + self.assertIn("function_meta", api_definition_mapping["get_token"])