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

时间:2017-10-29 12:13:27

标签: python python-unittest

我有一个类BaseTest,所有测试都是从它扩展而来的。 测试位于不同的模块和包中。 setUpClass和tearDownClass方法在每个unittest.TestCase类之前执行。 如何只执行一次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()

2 个答案:

答案 0 :(得分:1)

我认为unittest不具备通用设置和拆卸功能。你应该看看pytest,它的灯具更强大。

答案 1 :(得分:0)

可能与unittest有关,请在此处复制https://stackoverflow.com/a/64892396/2679740的答案

您可以通过定义startTestRun类的stopTestRununittest.TestResult来做到这一点。

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

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)