2

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

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

基本上我正在寻找的是JUnit和注释的python等价物。@BeforeClass@AfterClass

4

2 回答 2

2

我现在通过子类化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 块,它可能会使套件中的所有测试用例或其他东西失败。

于 2011-02-09T15:42:32.117 回答
1

来自Python unittest 文档

设置类():

在单个类运行测试之前调用的类方法。setUpClass 以类作为唯一参数调用,并且必须修饰为 classmethod():

@classmethod
def setUpClass(cls):
...

2.7 版中的新功能。

撕裂类():

在单个类中的测试运行后调用的类方法。tearDownClass 以类作为唯一参数调用,并且必须装饰为 classmethod():

@classmethod
def tearDownClass(cls):
    ...
于 2013-03-25T09:04:38.433 回答