【问题标题】:How can I execute tearDown and setUp method for all unittest.TestCase classes如何为所有 unittest.TestCase 类执行 tearDown 和 setUp 方法
【发布时间】:2018-04-10 12:50:22
【问题描述】:

我有一个类 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()

【问题讨论】:

    标签: python python-unittest


    【解决方案1】:

    可能与unittest 在这里复制https://stackoverflow.com/a/64892396/2679740 的答案

    你可以通过定义unittest.TestResult类的startTestRun,stopTestRun来做到这一点。

    通过将以下代码添加到我的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)
    

    【讨论】:

    • 那么您究竟如何让 TestSuite 使用您自定义的 TestResult?
    • 我还没有对此进行测试,但是,从我可以从源代码中分配的 Phthon3 文档链接中看到,并检查 init.py 如何在问题中工作关于这里 [1],我会说 init.py 的所有内容都包含在加载包时, setattr() 设置对象 [2] 的属性值和所有startTestRun 在运行任何测试之前运行。有道理:[1] stackoverflow.com/questions/119167/adding-code-to-init-py/… [2] docs.python.org/3/reference/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      相关资源
      最近更新 更多