如何为所有 unittest.TestCase 类 执行 tearDown 和 setUp 方法

How can I execute tearDown and setUp method for all unittest.TestCase classes

我有一个 class BaseTest,所有测试都是从它扩展的。 测试位于不同的模块和包中。 setUpClass 和 tearDownClass 方法在每个 unittest.TestCase class 之前执行。 我怎样才能只执行一次 setUp 和 tearDown。所有测试前后。

这是代码示例:

import unittest

class BaseTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

if __name__ == '__main__':
    unittest.main()

module2.py:

class TestOne(BaseTest):
    def test_one(self):
        print("Test One")

class TestTwo(BaseTest):
    def test_two(self):
        print("Test Two")

if __name__ == '__main__':
    unittest.main()

module3.py

class TestThree(BaseTest):
    def test_three(self):
        print("Test Three")


class TestFour(BaseTest):
    def test_four(self):
        print("Test Four")

if __name__ == '__main__':
    unittest.main()

module4.py

class TestFive(BaseTest):
    def test_five(self):
        print("Test Five")

if __name__ == '__main__':
    unittest.main()

我认为 unittest 没有用于通用设置和拆卸的工具。你应该看看pytest,它的fixtures更强大。

可能与 unittest 相关,请在此处复制 的答案

你可以通过定义 startTestRun,stopTestRun of unittest.TestResult class.

来实现

通过将以下代码添加到我的 tests/__init__.py 我设法实现了它。此代码对所有测试仅运行一次(无论测试 classes 和测试文件的数量如何)。

def startTestRun(self):
    """
    https://docs.python.org/3/library/unittest.html#unittest.TestResult.startTestRun
    Called once before any tests are executed.

    :return:
    """
    DockerCompose().start()


setattr(unittest.TestResult, 'startTestRun', startTestRun)


def stopTestRun(self):
    """
    https://docs.python.org/3/library/unittest.html#unittest.TestResult.stopTestRun
    Called once after all tests are executed.

    :return:
    """
    DockerCompose().compose.stop()


setattr(unittest.TestResult, 'stopTestRun', stopTestRun)