mirror of
https://github.com/httprunner/httprunner.git
synced 2026-06-10 02:09:51 +08:00
add testcase loader interface
This commit is contained in:
@@ -168,7 +168,7 @@ overall_def_dict = {
|
|||||||
testcases_cache_mapping = {}
|
testcases_cache_mapping = {}
|
||||||
|
|
||||||
|
|
||||||
def load_test_dependencies():
|
def _load_test_dependencies():
|
||||||
""" load all api and suite definitions.
|
""" load all api and suite definitions.
|
||||||
default api folder is "$CWD/tests/api/".
|
default api folder is "$CWD/tests/api/".
|
||||||
default suite folder is "$CWD/tests/suite/".
|
default suite folder is "$CWD/tests/suite/".
|
||||||
@@ -177,12 +177,12 @@ def load_test_dependencies():
|
|||||||
# load api definitions
|
# load api definitions
|
||||||
api_def_folder = os.path.join(os.getcwd(), "tests", "api")
|
api_def_folder = os.path.join(os.getcwd(), "tests", "api")
|
||||||
for test_file in load_folder_files(api_def_folder):
|
for test_file in load_folder_files(api_def_folder):
|
||||||
load_api_file(test_file)
|
_load_api_file(test_file)
|
||||||
|
|
||||||
# load suite definitions
|
# load suite definitions
|
||||||
suite_def_folder = os.path.join(os.getcwd(), "tests", "suite")
|
suite_def_folder = os.path.join(os.getcwd(), "tests", "suite")
|
||||||
for suite_file in load_folder_files(suite_def_folder):
|
for suite_file in load_folder_files(suite_def_folder):
|
||||||
suite = load_test_file(suite_file)
|
suite = _load_test_file(suite_file)
|
||||||
if "def" not in suite["config"]:
|
if "def" not in suite["config"]:
|
||||||
raise exceptions.ParamsError("def missed in suite file: {}!".format(suite_file))
|
raise exceptions.ParamsError("def missed in suite file: {}!".format(suite_file))
|
||||||
|
|
||||||
@@ -192,7 +192,7 @@ def load_test_dependencies():
|
|||||||
overall_def_dict["suite"][function_meta["func_name"]] = suite
|
overall_def_dict["suite"][function_meta["func_name"]] = suite
|
||||||
|
|
||||||
|
|
||||||
def load_api_file(file_path):
|
def _load_api_file(file_path):
|
||||||
""" load api definition from file and store in overall_def_dict["api"]
|
""" load api definition from file and store in overall_def_dict["api"]
|
||||||
api file should be in format below:
|
api file should be in format below:
|
||||||
[
|
[
|
||||||
@@ -235,7 +235,7 @@ def load_api_file(file_path):
|
|||||||
overall_def_dict["api"][func_name] = api_dict
|
overall_def_dict["api"][func_name] = api_dict
|
||||||
|
|
||||||
|
|
||||||
def load_test_file(file_path):
|
def _load_test_file(file_path):
|
||||||
""" load testcase file or testsuite file
|
""" load testcase file or testsuite file
|
||||||
@param file_path: absolute valid file path
|
@param file_path: absolute valid file path
|
||||||
file_path should be in format below:
|
file_path should be in format below:
|
||||||
@@ -390,7 +390,7 @@ def load_testcases(path):
|
|||||||
|
|
||||||
elif os.path.isfile(path):
|
elif os.path.isfile(path):
|
||||||
try:
|
try:
|
||||||
testcase = load_test_file(path)
|
testcase = _load_test_file(path)
|
||||||
if testcase["testcases"]:
|
if testcase["testcases"]:
|
||||||
testcases_list = [testcase]
|
testcases_list = [testcase]
|
||||||
else:
|
else:
|
||||||
@@ -405,3 +405,12 @@ def load_testcases(path):
|
|||||||
|
|
||||||
testcases_cache_mapping[path] = testcases_list
|
testcases_cache_mapping[path] = testcases_list
|
||||||
return testcases_list
|
return testcases_list
|
||||||
|
|
||||||
|
|
||||||
|
def load(path):
|
||||||
|
""" main interface for loading testcases
|
||||||
|
@param (str) path: testcase file/folder path
|
||||||
|
@return (list) testcases list
|
||||||
|
"""
|
||||||
|
_load_test_dependencies()
|
||||||
|
return load_testcases(path)
|
||||||
|
|||||||
@@ -40,9 +40,8 @@ def gen_locustfile(testcase_file_path):
|
|||||||
"templates",
|
"templates",
|
||||||
"locustfile_template"
|
"locustfile_template"
|
||||||
)
|
)
|
||||||
loader.load_test_dependencies()
|
testcases = loader.load(testcase_file_path)
|
||||||
testset = loader.load_test_file(testcase_file_path)
|
host = testcases[0].get("config", {}).get("request", {}).get("base_url", "")
|
||||||
host = testset.get("config", {}).get("request", {}).get("base_url", "")
|
|
||||||
|
|
||||||
with io.open(template_path, encoding='utf-8') as template:
|
with io.open(template_path, encoding='utf-8') as template:
|
||||||
with io.open(locustfile_path, 'w', encoding='utf-8') as locustfile:
|
with io.open(locustfile_path, 'w', encoding='utf-8') as locustfile:
|
||||||
|
|||||||
@@ -178,8 +178,7 @@ def init_test_suites(path_or_testsets, mapping=None, http_client_session=None):
|
|||||||
passed in variables mapping, it will override variables in config block
|
passed in variables mapping, it will override variables in config block
|
||||||
"""
|
"""
|
||||||
if not testcase.is_testsets(path_or_testsets):
|
if not testcase.is_testsets(path_or_testsets):
|
||||||
loader.load_test_dependencies()
|
testsets = loader.load(path_or_testsets)
|
||||||
testsets = loader.load_testcases(path_or_testsets)
|
|
||||||
else:
|
else:
|
||||||
testsets = path_or_testsets
|
testsets = path_or_testsets
|
||||||
|
|
||||||
|
|||||||
@@ -151,13 +151,13 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def test_load_test_dependencies(self):
|
def test_load_test_dependencies(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
overall_def_dict = loader.overall_def_dict
|
overall_def_dict = loader.overall_def_dict
|
||||||
self.assertIn("get_token", overall_def_dict["api"])
|
self.assertIn("get_token", overall_def_dict["api"])
|
||||||
self.assertIn("create_and_check", overall_def_dict["suite"])
|
self.assertIn("create_and_check", overall_def_dict["suite"])
|
||||||
|
|
||||||
def test_load_api_file(self):
|
def test_load_api_file(self):
|
||||||
loader.load_api_file("tests/api/basic.yml")
|
loader._load_api_file("tests/api/basic.yml")
|
||||||
overall_api_def_dict = loader.overall_def_dict["api"]
|
overall_api_def_dict = loader.overall_def_dict["api"]
|
||||||
self.assertIn("get_token",overall_api_def_dict)
|
self.assertIn("get_token",overall_api_def_dict)
|
||||||
self.assertEqual("/api/get-token", overall_api_def_dict["get_token"]["request"]["url"])
|
self.assertEqual("/api/get-token", overall_api_def_dict["get_token"]["request"]["url"])
|
||||||
@@ -165,16 +165,16 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
self.assertEqual(len(overall_api_def_dict["get_token"]["validate"]), 3)
|
self.assertEqual(len(overall_api_def_dict["get_token"]["validate"]), 3)
|
||||||
|
|
||||||
def test_load_test_file_suite(self):
|
def test_load_test_file_suite(self):
|
||||||
loader.load_api_file("tests/api/basic.yml")
|
loader._load_api_file("tests/api/basic.yml")
|
||||||
testset = loader.load_test_file("tests/suite/create_and_get.yml")
|
testset = loader._load_test_file("tests/suite/create_and_get.yml")
|
||||||
self.assertEqual(testset["config"]["name"], "create user and check result.")
|
self.assertEqual(testset["config"]["name"], "create user and check result.")
|
||||||
self.assertEqual(len(testset["testcases"]), 3)
|
self.assertEqual(len(testset["testcases"]), 3)
|
||||||
self.assertEqual(testset["testcases"][0]["name"], "make sure user $uid does not exist")
|
self.assertEqual(testset["testcases"][0]["name"], "make sure user $uid does not exist")
|
||||||
self.assertEqual(testset["testcases"][0]["request"]["url"], "/api/users/$uid")
|
self.assertEqual(testset["testcases"][0]["request"]["url"], "/api/users/$uid")
|
||||||
|
|
||||||
def test_load_test_file_testcase(self):
|
def test_load_test_file_testcase(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
testset = loader.load_test_file("tests/testcases/smoketest.yml")
|
testset = loader._load_test_file("tests/testcases/smoketest.yml")
|
||||||
self.assertEqual(testset["config"]["name"], "smoketest")
|
self.assertEqual(testset["config"]["name"], "smoketest")
|
||||||
self.assertEqual(testset["config"]["path"], "tests/testcases/smoketest.yml")
|
self.assertEqual(testset["config"]["path"], "tests/testcases/smoketest.yml")
|
||||||
self.assertIn("device_sn", testset["config"]["variables"][0])
|
self.assertIn("device_sn", testset["config"]["variables"][0])
|
||||||
@@ -182,7 +182,7 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
self.assertEqual(testset["testcases"][0]["name"], "get token")
|
self.assertEqual(testset["testcases"][0]["name"], "get token")
|
||||||
|
|
||||||
def test_get_block_by_name(self):
|
def test_get_block_by_name(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
ref_call = "get_user($uid, $token)"
|
ref_call = "get_user($uid, $token)"
|
||||||
block = loader._get_block_by_name(ref_call, "api")
|
block = loader._get_block_by_name(ref_call, "api")
|
||||||
self.assertEqual(block["request"]["url"], "/api/users/$uid")
|
self.assertEqual(block["request"]["url"], "/api/users/$uid")
|
||||||
@@ -190,13 +190,13 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
self.assertEqual(block["function_meta"]["args"], ['$uid', '$token'])
|
self.assertEqual(block["function_meta"]["args"], ['$uid', '$token'])
|
||||||
|
|
||||||
def test_get_block_by_name_args_mismatch(self):
|
def test_get_block_by_name_args_mismatch(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
ref_call = "get_user($uid, $token, $var)"
|
ref_call = "get_user($uid, $token, $var)"
|
||||||
with self.assertRaises(exceptions.ParamsError):
|
with self.assertRaises(exceptions.ParamsError):
|
||||||
loader._get_block_by_name(ref_call, "api")
|
loader._get_block_by_name(ref_call, "api")
|
||||||
|
|
||||||
def test_override_block(self):
|
def test_override_block(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
def_block = loader._get_block_by_name("get_token($user_agent, $device_sn, $os_platform, $app_version)", "api")
|
def_block = loader._get_block_by_name("get_token($user_agent, $device_sn, $os_platform, $app_version)", "api")
|
||||||
test_block = {
|
test_block = {
|
||||||
"name": "override block",
|
"name": "override block",
|
||||||
@@ -217,7 +217,7 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
self.assertIn({'check': 'content.token', 'comparator': 'len_eq', 'expect': 32}, test_block["validate"])
|
self.assertIn({'check': 'content.token', 'comparator': 'len_eq', 'expect': 32}, test_block["validate"])
|
||||||
|
|
||||||
def test_get_test_definition_api(self):
|
def test_get_test_definition_api(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
api_def = loader._get_test_definition("get_headers", "api")
|
api_def = loader._get_test_definition("get_headers", "api")
|
||||||
self.assertEqual(api_def["request"]["url"], "/headers")
|
self.assertEqual(api_def["request"]["url"], "/headers")
|
||||||
self.assertEqual(len(api_def["setup_hooks"]), 2)
|
self.assertEqual(len(api_def["setup_hooks"]), 2)
|
||||||
@@ -227,7 +227,7 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
loader._get_test_definition("get_token_XXX", "api")
|
loader._get_test_definition("get_token_XXX", "api")
|
||||||
|
|
||||||
def test_get_test_definition_suite(self):
|
def test_get_test_definition_suite(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
api_def = loader._get_test_definition("create_and_check", "suite")
|
api_def = loader._get_test_definition("create_and_check", "suite")
|
||||||
self.assertEqual(api_def["config"]["name"], "create user and check result.")
|
self.assertEqual(api_def["config"]["name"], "create user and check result.")
|
||||||
|
|
||||||
@@ -276,7 +276,7 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
self.assertIn('method', test['request'])
|
self.assertIn('method', test['request'])
|
||||||
|
|
||||||
def test_load_testcases_by_path_folder(self):
|
def test_load_testcases_by_path_folder(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
# absolute folder path
|
# absolute folder path
|
||||||
path = os.path.join(os.getcwd(), 'tests/data')
|
path = os.path.join(os.getcwd(), 'tests/data')
|
||||||
testset_list_1 = loader.load_testcases(path)
|
testset_list_1 = loader.load_testcases(path)
|
||||||
@@ -315,7 +315,7 @@ class TestSuiteLoader(unittest.TestCase):
|
|||||||
loader.load_testcases(path)
|
loader.load_testcases(path)
|
||||||
|
|
||||||
def test_load_testcases_by_path_layered(self):
|
def test_load_testcases_by_path_layered(self):
|
||||||
loader.load_test_dependencies()
|
loader._load_test_dependencies()
|
||||||
path = os.path.join(
|
path = os.path.join(
|
||||||
os.getcwd(), 'tests/data/demo_testset_layer.yml')
|
os.getcwd(), 'tests/data/demo_testset_layer.yml')
|
||||||
testsets_list = loader.load_testcases(path)
|
testsets_list = loader.load_testcases(path)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class TestTask(ApiServerUnittest):
|
|||||||
|
|
||||||
def test_create_suite(self):
|
def test_create_suite(self):
|
||||||
testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_variables.yml')
|
testcase_file_path = os.path.join(os.getcwd(), 'tests/data/demo_testset_variables.yml')
|
||||||
testset = loader.load_test_file(testcase_file_path)
|
testset = loader._load_test_file(testcase_file_path)
|
||||||
suite = task.TestSuite(testset)
|
suite = task.TestSuite(testset)
|
||||||
self.assertEqual(suite.countTestCases(), 3)
|
self.assertEqual(suite.countTestCases(), 3)
|
||||||
for testcase in suite:
|
for testcase in suite:
|
||||||
|
|||||||
Reference in New Issue
Block a user