我现在通过子类化TestSuite 类来完成它,因为标准加载器将所有测试方法包装在定义它们的TestCase 实例中,并将它们放在一起在TestSuite 中。我让 TestSuite 调用第一个 TestCase 的 before() 和 after() 方法。这当然意味着您不能为您的 TestCase 对象初始化任何值,但无论如何您可能都希望在您的 setUp 中执行此操作。
测试套件看起来像这样:
class BeforeAfterSuite(unittest.TestSuite):
def run(self, result):
if len(self._tests) < 1:
return unittest.TestSuite.run(self, result)
first_test = self._tests[0]
if "before" in dir(first_test):
first_test.before()
result = unittest.TestSuite.run(self, result)
if "after" in dir(first_test):
first_test.after()
return result
对于一些更细粒度的控件,我还创建了自定义 TestLoader,它确保 BeforeAfterSuite 仅用于包装 test-method-TestCase 对象,如下所示:
class BeforeAfterLoader(unittest.TestLoader):
def loadTestsFromTestCase(self, testCaseClass):
self.suiteClass = BeforeAfterSuite
suite = unittest.TestLoader.loadTestsFromTestCase(self, testCaseClass)
self.suiteClass = unittest.TestLoader.suiteClass
return suite
这里可能缺少的是前后的 try/except 块,它可能会使套件中的所有测试用例或其他东西失败。