我是单元测试mercurial集成并且有一个测试类,它当前在其 setUp 方法中创建一个包含文件和该存储库的克隆的存储库,并在其 tearDown中删除它们方法。
正如您可能想象的那样,这种性能非常快,特别是如果我必须为每个测试单独执行此操作。 所以我想要做的是创建文件夹并在加载类时为mercurial初始化它们,因此 TestCase 类中的每个单元测试都可以使用这些存储库。然后,当所有测试都运行时,我想删除它们。我的 setUp 和 tearDown 方法唯一需要处理的是两个存储库在每次测试之间处于相同的状态。
基本上我正在寻找的是 python 相当于JUnit的 @BeforeClass
和 @AfterClass
注释。
答案 0 :(得分:2)
我现在通过继承TestSuite类来完成它,因为标准加载器将所有测试方法包装在TestCase的一个实例中,并在它们中定义它们并将它们放在一个TestSuite中。我让TestSuite调用第一个TestCase的before()和after()方法。这当然意味着您无法初始化TestCase对象的任何值,但您可能希望在setUp中执行此操作。
TestSuite看起来像这样:
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块可能会使套件中的所有测试用例失败。
答案 1 :(得分:1)
来自Python unittest documentation:
setUpClass():
在单个类运行中的测试之前调用的类方法。使用类作为唯一参数调用setUpClass,并且必须将其装饰为classmethod():
@classmethod
def setUpClass(cls):
...
2.7版本中的新功能。
tearDownClass():
在单个类中的测试之后调用的类方法已运行。使用类作为唯一参数调用tearDownClass,并且必须将其装饰为classmethod():
@classmethod
def tearDownClass(cls):
...