Python 的单元测试是否具有针对整个测试套件的全局设置?

Does Python's unittest have a global setUp for an entire TestSuite?

我对 Python 的 unittest 库有点陌生,我目前正在考虑在 运行 我的任何集成测试之前设置我的 Flask 服务器。我知道 unittest.TestCase class 允许您在 class 中的每个测试用例之前使用 setUp()。我也知道同一个 class 有另一个名为 setUpClass() 的方法,它在整个 class.

中只运行一次

我真正感兴趣的是试图弄清楚如何做类似 setUpClass() 的事情,但要在整个 unittest.TestSuite 上完成。但是,我运气不好。

当然,我可以为每个 TestCase 设置服务器,但我想避免这样做。

在一个单独的问题上有一个 ,它建议通过覆盖 unittest.TestResult 的 startTestRun(),您可以拥有一个覆盖整个测试套件的设置函数。但是,我尝试将自定义 TestResult 对象传递到单元测试中。 TextTestRunner 没有成功。

那么,我究竟应该如何为整个测试套件进行设置?

这没有很好的记录,但我最近也需要这样做。

docs mention that TestResult.startTestRun 是“在执行任何测试之前调用一次。”

如您所见,在 the implementation 中,该方法不执行任何操作。

我试过 subclassing TestResult 和各种东西。我无法完成任何工作,所以我最终只猴子修补 class.

在我的测试包的 __init__.py 中,我做了以下操作:

import unittest


OLD_TEST_RUN = unittest.result.TestResult.startTestRun

def startTestRun(self):
    # whatever custom code you want to run exactly once before 
    # any of your tests runs goes here:
    ...

    # just in case future versions do something in this method
    # we'll call the existing method
    OLD_TEST_RUN(self)

unittest.result.TestResult.startTestRun = startTestRun

如果您需要在所有测试 运行.

之后 运行 清理代码,还有一个 stopTestRun 方法

请注意,这并不是 TestResult 的单独版本。 unittest 模块照常使用现有的。我们所做的唯一一件事就是对 startTestRun

的自定义实现进行手术移植