python - 如何在 pyUnit 中创建类范围的测试装置?

标签 python unit-testing python-unittest

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

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

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

最佳答案

我现在通过子类化 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/

相关文章:

python - 如何调试 SQLAlchemy 查询的缓慢启动时间?

python-3.x - 如何为运行直到键盘中断并且不返回任何内容的类编写单元测试?

python - 中断 Python 单元测试时关闭资源

python - 如果它们在姐妹文件夹中,如何让我的 Python 单元测试导入被测试的模块?

python - 在 Python DataFrame 中拆分字符串

python - 这个 dict to list 转换的 pythonic 方法是什么?

python - cython 中的数组数组

javascript - 单元测试 Angular 指令点击处理程序

c# - 单元测试错误 - 单元测试适配器无法连接到数据源或读取数据

python - 单元测试 : How to assert multiple calls of same method?