fix #366: teststep name

This commit is contained in:
debugtalk
2018-08-31 15:48:46 +08:00
parent 86b63fab6a
commit ec2058f2e2
6 changed files with 78 additions and 34 deletions
+30 -3
View File
@@ -35,6 +35,7 @@ class HttpRunner(object):
} }
""" """
loader.reset_loader()
loader.dot_env_path = kwargs.pop("dot_env_path", None) loader.dot_env_path = kwargs.pop("dot_env_path", None)
self.http_client_session = kwargs.pop("http_client_session", None) self.http_client_session = kwargs.pop("http_client_session", None)
self.kwargs = kwargs self.kwargs = kwargs
@@ -173,7 +174,7 @@ class HttpRunner(object):
return parsed_testcases_list return parsed_testcases_list
def __initialize(self, testcases): def initialize(self, testcases):
""" initialize test runner with parsed testcases. """ initialize test runner with parsed testcases.
Args: Args:
@@ -183,6 +184,32 @@ class HttpRunner(object):
tuple: (unittest.TextTestRunner(), unittest.TestSuite()) tuple: (unittest.TextTestRunner(), unittest.TestSuite())
""" """
def __add_teststep(test_runner, config, teststep_dict):
""" add teststep to testcase.
"""
def test(self):
try:
test_runner.run_test(teststep_dict)
except exceptions.MyBaseFailure as ex:
self.fail(str(ex))
finally:
if hasattr(test_runner.http_client_session, "meta_data"):
self.meta_data = test_runner.http_client_session.meta_data
self.meta_data["validators"] = test_runner.evaluated_validators
test_runner.http_client_session.init_meta_data()
try:
teststep_dict["name"] = parser.parse_data(
teststep_dict["name"],
config.get("variables", {}),
config.get("functions", {})
)
except exceptions.VariableNotFound:
pass
test.__doc__ = teststep_dict["name"]
return test
self.kwargs.setdefault("resultclass", report.HtmlTestResult) self.kwargs.setdefault("resultclass", report.HtmlTestResult)
unittest_runner = unittest.TextTestRunner(**self.kwargs) unittest_runner = unittest.TextTestRunner(**self.kwargs)
@@ -200,7 +227,7 @@ class HttpRunner(object):
# suppose one testcase should not have more than 9999 steps, # suppose one testcase should not have more than 9999 steps,
# and one step should not run more than 999 times. # and one step should not run more than 999 times.
test_method_name = 'test_{:04}_{:03}'.format(index, times_index) test_method_name = 'test_{:04}_{:03}'.format(index, times_index)
test_method = utils.add_teststep(test_runner, teststep_dict) test_method = __add_teststep(test_runner, config, teststep_dict)
setattr(TestSequense, test_method_name, test_method) setattr(TestSequense, test_method_name, test_method)
loaded_testcase = loader.loadTestsFromTestCase(TestSequense) loaded_testcase = loader.loadTestsFromTestCase(TestSequense)
@@ -240,7 +267,7 @@ class HttpRunner(object):
parsed_testcases_list = self.parse_tests(testcases_list) parsed_testcases_list = self.parse_tests(testcases_list)
# initialize # initialize
unittest_runner, test_suite = self.__initialize(parsed_testcases_list) unittest_runner, test_suite = self.initialize(parsed_testcases_list)
# aggregate # aggregate
self.summary = { self.summary = {
+11 -9
View File
@@ -25,7 +25,6 @@ project_mapping = {
""" """
dot_env_path = None dot_env_path = None
testcases_cache_mapping = {} testcases_cache_mapping = {}
project_working_directory = os.getcwd() project_working_directory = os.getcwd()
@@ -852,6 +851,9 @@ def reset_loader():
global project_working_directory global project_working_directory
project_working_directory = os.getcwd() project_working_directory = os.getcwd()
global dot_env_path
dot_env_path = None
project_mapping["debugtalk"] = { project_mapping["debugtalk"] = {
"variables": {}, "variables": {},
"functions": {} "functions": {}
@@ -937,20 +939,25 @@ def load_testcases(path):
return testcases_list return testcases_list
if not os.path.exists(path):
err_msg = "path not exist: {}".format(path)
logger.log_error(err_msg)
raise exceptions.FileNotFound(err_msg)
if not os.path.isabs(path): if not os.path.isabs(path):
path = os.path.join(os.getcwd(), path) path = os.path.join(os.getcwd(), path)
if path in testcases_cache_mapping: if path not in testcases_cache_mapping:
load_project_tests(path)
else:
return testcases_cache_mapping[path] return testcases_cache_mapping[path]
if os.path.isdir(path): if os.path.isdir(path):
load_project_tests(path)
files_list = load_folder_files(path) files_list = load_folder_files(path)
testcases_list = load_testcases(files_list) testcases_list = load_testcases(files_list)
elif os.path.isfile(path): elif os.path.isfile(path):
try: try:
load_project_tests(path)
testcase = _load_test_file(path) testcase = _load_test_file(path)
if testcase["teststeps"]: if testcase["teststeps"]:
testcases_list = [testcase] testcases_list = [testcase]
@@ -959,10 +966,5 @@ def load_testcases(path):
except exceptions.FileFormatError: except exceptions.FileFormatError:
testcases_list = [] testcases_list = []
else:
err_msg = "path not exist: {}".format(path)
logger.log_error(err_msg)
raise exceptions.FileNotFound(err_msg)
testcases_cache_mapping[path] = testcases_list testcases_cache_mapping[path] = testcases_list
return testcases_list return testcases_list
+1 -1
View File
@@ -102,7 +102,7 @@ class Runner(object):
SkipTest: skip teststep SkipTest: skip teststep
""" """
# TODO: move skip to __initialize # TODO: move skip to initialize
skip_reason = None skip_reason = None
if "skip" in teststep_dict: if "skip" in teststep_dict:
-18
View File
@@ -256,24 +256,6 @@ def override_mapping_list(variables, new_mapping):
) )
def add_teststep(test_runner, teststep_dict):
""" add teststep to testcase.
"""
def test(self):
try:
test_runner.run_test(teststep_dict)
except exceptions.MyBaseFailure as ex:
self.fail(str(ex))
finally:
if hasattr(test_runner.http_client_session, "meta_data"):
self.meta_data = test_runner.http_client_session.meta_data
self.meta_data["validators"] = test_runner.evaluated_validators
test_runner.http_client_session.init_meta_data()
test.__doc__ = teststep_dict["name"]
return test
def get_testcase_io(testcase): def get_testcase_io(testcase):
""" get testcase input(variables) and output. """ get testcase input(variables) and output.
+1 -1
View File
@@ -18,7 +18,7 @@
- token - token
- test: - test:
name: get token with $user_agent and $app_version name: get token with $user_agent and $username
api: get_token($user_agent, $device_sn, $os_platform, $app_version) api: get_token($user_agent, $device_sn, $os_platform, $app_version)
extract: extract:
- token: content.token - token: content.token
+35 -2
View File
@@ -266,12 +266,12 @@ class TestHttpRunner(ApiServerUnittest):
self.assertFalse(summary["success"]) self.assertFalse(summary["success"])
self.assertEqual(summary["stat"]["errors"], 1) self.assertEqual(summary["stat"]["errors"], 1)
def test_run_testset_hardcode(self): def test_run_testcase_hardcode(self):
for testcase_file_path in self.testcase_file_path_list: for testcase_file_path in self.testcase_file_path_list:
runner = HttpRunner().run(testcase_file_path) runner = HttpRunner().run(testcase_file_path)
self.assertTrue(runner.summary["success"]) self.assertTrue(runner.summary["success"])
def test_run_testsets_hardcode(self): def test_run_testcases_hardcode(self):
runner = HttpRunner().run(self.testcase_file_path_list) runner = HttpRunner().run(self.testcase_file_path_list)
summary = runner.summary summary = runner.summary
self.assertTrue(summary["success"]) self.assertTrue(summary["success"])
@@ -344,6 +344,39 @@ class TestHttpRunner(ApiServerUnittest):
self.assertIn("in", summary["details"][0]["in_out"]) self.assertIn("in", summary["details"][0]["in_out"])
self.assertIn("out", summary["details"][0]["in_out"]) self.assertIn("out", summary["details"][0]["in_out"])
def test_run_testcase_with_parameters_name(self):
testcase_file_path = os.path.join(
os.getcwd(), 'tests/data/demo_parameters.yml')
runner = HttpRunner()
testcases = runner.load_tests(testcase_file_path)
parsed_testcases = runner.parse_tests(testcases)
unittest_runner, test_suite = runner.initialize(parsed_testcases)
self.assertEqual(
test_suite._tests[0].teststeps[0]['name'],
'get token with iOS/10.1 and test1'
)
self.assertEqual(
test_suite._tests[1].teststeps[0]['name'],
'get token with iOS/10.1 and test2'
)
self.assertEqual(
test_suite._tests[2].teststeps[0]['name'],
'get token with iOS/10.2 and test1'
)
self.assertEqual(
test_suite._tests[3].teststeps[0]['name'],
'get token with iOS/10.2 and test2'
)
self.assertEqual(
test_suite._tests[4].teststeps[0]['name'],
'get token with iOS/10.3 and test1'
)
self.assertEqual(
test_suite._tests[5].teststeps[0]['name'],
'get token with iOS/10.3 and test2'
)
def test_load_tests(self): def test_load_tests(self):
testcase_file_path = os.path.join( testcase_file_path = os.path.join(
os.getcwd(), 'tests/data/demo_testcase.yml') os.getcwd(), 'tests/data/demo_testcase.yml')