如何在pyUnit中创建类范围的测试夹具?

时间:2011-02-02 14:54:49

标签: python unit-testing python-unittest

我是单元测试mercurial集成并且有一个测试类,它当前在其 setUp 方法中创建一个包含文件和该存储库的克隆的存储库,并在其 tearDown中删除它们方法。

正如您可能想象的那样,这种性能非常快,特别是如果我必须为每个测试单独执行此操作。 所以我想要做的是创建文件夹并在加载类时为mercurial初始化它们,因此 TestCase 类中的每个单元测试都可以使用这些存储库。然后,当所有测试都运行时,我想删除它们。我的 setUp tearDown 方法唯一需要处理的是两个存储库在每次测试之间处于相同的状态。

基本上我正在寻找的是 python 相当于JUnit的 @BeforeClass @AfterClass 注释。

2 个答案:

答案 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):
    ...