【问题标题】:Unittest setUp/tearDown for several tests用于多个测试的单元测试 setUp/tearDown
【发布时间】:2012-01-13 10:46:07
【问题描述】:

是否有在测试场景开始/结束时触发的函数? setUp 和 tearDown 函数在每次测试之前/之后触发。

我通常想要这个:

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

目前,这些setUp和tearDown是单元测试,分布在我所有的场景中(包含很多测试),一个是第一个测试,另一个是最后一个测试。

【问题讨论】:

  • 哪个版本?在 Python 2.7 中,unittest 模块已扩展为包含 module_setup 和 module_teardown。
  • 2.7 还引入了 setUpClass() 和 tearDownClass() 类方法,这可以让您在同一个文件中拥有多个类,并具有自己的每个套件设置和拆卸。

标签: python unit-testing


【解决方案1】:

从 2.7 开始(每个 the documentation),您将获得 setUpClasstearDownClass,它们分别在给定类中的测试运行之前和之后执行。或者,如果您在一个文件中有一组它们,您可以使用 setUpModuletearDownModule (documentation)。

否则,您最好的选择可能是创建自己的派生TestSuite 并覆盖run()。所有其他调用将由父级处理,并且 run 将围绕调用父级的 run 方法调用您的设置和拆卸代码。

【讨论】:

    【解决方案2】:

    我也有同样的场景,对我来说 setUpClass 和 tearDownClass 方法效果很好

    import unittest
    
    class Test(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls._connection = createExpensiveConnectionObject()
    
        @classmethod
        def tearDownClass(cls):
            cls._connection.destroy()
    

    【讨论】:

    • 这应该被更新为接受的答案,因为它显示了一个正确的例子,并且这些函数必须是类方法才能工作,这在接受的答案中没有提到。
    【解决方案3】:

    这是一个示例:3 个测试方法访问一个共享资源,该资源创建一次,而不是每次测试。

    import unittest
    import random
    
    class TestSimulateLogistics(unittest.TestCase):
    
        shared_resource = None
    
        @classmethod
        def setUpClass(cls):
            cls.shared_resource = random.randint(1, 100)
    
        @classmethod
        def tearDownClass(cls):
            cls.shared_resource = None
    
        def test_1(self):
            print('test 1:', self.shared_resource)
    
        def test_2(self):
            print('test 2:', self.shared_resource)
    
        def test_3(self):
            print('test 3:', self.shared_resource)
    
    

    【讨论】:

    • 是的。很好。 setUpClass 只对所有三个测试用例执行一个。
    【解决方案4】:

    对于 python 2.5,在使用 pydev 时,这有点困难。 pydev 似乎没有使用测试套件,而是找到所有单独的测试用例并单独运行它们。

    我的解决方案是使用这样的类变量:

    class TestCase(unittest.TestCase):
        runCount = 0
    
        def setUpClass(self):
            pass # overridden in actual testcases
    
        def run(self, result=None):
            if type(self).runCount == 0:
                self.setUpClass()
    
            super(TestCase, self).run(result)
            type(self).runCount += 1
    

    有了这个技巧,当你从这个TestCase(而不是从原来的unittest.TestCase)继承时,你也会继承0的runCount。然后在run方法中,runCount的子测试用例被检查并递增。这使得该类的 runCount 变量为 0。

    这意味着setUpClass 每个类只会运行一次,而不是每个实例运行一次。

    我还没有tearDownClass 方法,但我想使用该计数器可以做一些事情。

    【讨论】:

      【解决方案5】:
      import unittest
      
      class Test(unittest.TestCase):
          @classmethod
          def setUpClass(cls):
              cls.shared_data = "dddd"
      
          @classmethod
          def tearDownClass(cls):
              cls.shared_data.destroy()
      
          def test_one(self):
              print("Test one")
          
          def test_two(self):
              print("Test 2")
      

      更多信息请访问Python unit test document

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 2020-06-23
        • 2015-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多