diff --git a/testbase/loader.py b/testbase/loader.py index 3a05c1a..5da4191 100644 --- a/testbase/loader.py +++ b/testbase/loader.py @@ -317,9 +317,15 @@ def _load_from_testsuite( ignore_testsuite=True, ) else: - tests += self._load_from_class( - test, data_key, exclude_data_key=exclude_data_key, attrs=attrs - ) + if issubclass(test, TestSuite): + testcases = self._load_from_testsuite( + test, data_key, exclude_data_key=exclude_data_key, attrs=attrs + ) + tests += [test(testcases)] + else: + tests += self._load_from_class( + test, data_key, exclude_data_key=exclude_data_key, attrs=attrs + ) return [it for it in tests if not cls.filter(it)] diff --git a/testbase/testsuite.py b/testbase/testsuite.py index 7e12916..c306fd9 100644 --- a/testbase/testsuite.py +++ b/testbase/testsuite.py @@ -198,9 +198,16 @@ def _log_testsuite_error(self, testsuite, testresult, message): def _run_test(self, testsuite, test, testresult_factory, testresult): """执行测试用例""" - testresult.begin_step(test.test_name) + step_name = test.test_name + if isinstance(test, TestSuite): + step_name = "【%s】(%s)" % (step_name, test.exec_mode) + if testsuite.root_test_result and testsuite.root_test_result != testresult: + testsuite.root_test_result.begin_step(step_name) + testresult.begin_step(step_name) testsuite.current_stage = test.test_name runner = getattr(test, "case_runner", TestCaseRunner()) + if isinstance(test, TestSuite): + test.root_test_result = testsuite.root_test_result case_result = runner.run(test, testresult_factory) if not case_result.passed: self._log_testsuite_error( @@ -316,9 +323,13 @@ def run(self, testsuite, testresult_factory): raise ValueError("Invalid testsuite type: %s" % type(testsuite)) testresult = testresult_factory.create(testsuite) testresult.begin_test(testsuite) - testresult.begin_step("pre_test") + if testsuite.root_test_result and testsuite.root_test_result != testresult: + testsuite.root_test_result.begin_step("【%s】 - pre_test" % testsuite.__class__.__name__) + testresult.begin_step("【%s】 - pre_test" % testsuite.__class__.__name__) testsuite.init_test(testresult) result = TestResultCollection([testresult], False) + if not testsuite.root_test_result: + testsuite.root_test_result = testresult try: testsuite.pre_test() except: @@ -345,7 +356,9 @@ def run(self, testsuite, testresult_factory): else: raise ValueError("Invalid exec mode: %s" % self._exec_mode) - testresult.begin_step("post_test") + if testsuite.root_test_result and testsuite.root_test_result != testresult: + testsuite.root_test_result.begin_step("【%s】 - post_test" % testsuite.__class__.__name__) + testresult.begin_step("【%s】 - post_test" % testsuite.__class__.__name__) try: testsuite.post_test() except: @@ -388,6 +401,7 @@ def __init__(self, testcases): self.__testcases = testcases self.__testresults = [] self.__current_stage = "" + self.__root_test_result = None def __iter__(self): for it in self.__testcases: @@ -440,6 +454,14 @@ def current_stage(self): def current_stage(self, value): self.__current_stage = value + @property + def root_test_result(self): + return self.__root_test_result + + @root_test_result.setter + def root_test_result(self, value): + self.__root_test_result = value + @classmethod def filter(cls, testcase): if not cls.testcase_filter: