我正在对 Mercurial 集成进行单元测试,并且有一个测试类,该类当前在其 setUp 方法中创建一个包含文件和该存储库克隆的存储库,并在其 tearDown 中删除它们em> 方法。
正如您可能想象的那样,这会非常快地提高性能,特别是如果我必须单独为每个测试执行此操作。
所以我想做的是创建文件夹并在加载类时初始化它们以供 Mercurial 使用,这样 TestCase 类中的每个单元测试都可以使用这些存储库。然后,当所有测试都运行时,我想删除它们。我的 setUp 和 tearDown 方法唯一需要注意的是两个存储库在每次测试之间处于相同的状态。
基本上我正在寻找的是 JUnit 的 @BeforeClass
和 @AfterClass
的 python 等价物注释。
最佳答案
我现在通过子类化 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 仅用于包装测试方法 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 block ,它可能会使套件中的所有测试用例或其他东西失败。
关于python - 如何在 pyUnit 中创建类范围的测试装置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4875883/