单元测试setUp / tearDown进行多次测试

时间:2011-12-05 17:54:12

标签: python unit-testing

是否有在测试场景的开头/结尾触发的函数?函数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是单元测试并在我的所有场景中传播(包含许多测试),一个是第一个测试,另一个是最后一个测试。

5 个答案:

答案 0 :(得分:121)

从2.7(每the documentation)开始,你得到的setUpClasstearDownClass分别在给定类的测试之前和之后执行。或者,如果您在一个文件中包含一组,则可以使用setUpModuletearDownModuledocumentation)。

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

答案 1 :(得分:41)

我有相同的场景,对我来说setUpClass和tearDownClass方法完美无缺

import unittest

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

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()

答案 2 :(得分:1)

对于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}的0. runCount。然后在run方法中,检查并递增子测试用例的runCount。这使此类的runCount变量保持为0。

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

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

答案 3 :(得分:1)

这里是一个示例: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)

答案 4 :(得分:0)

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