关于python:用于多个测试的Unittest setUp / tearDown

Unittest setUp/tearDown for several tests

是否有在测试方案的开始/结束时激发的函数?每次测试之前/之后都会触发函数设置和拆卸。

我通常想要这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

现在,这些设置和拆卸是单元测试,并且分布在我的所有场景中(包含许多测试),一个是第一个测试,另一个是最后一个测试。


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

否则,您最好的选择可能是创建自己的派生测试套件并重写run()。所有其他调用都将由父级处理,而run将围绕调用父级的run方法来调用设置和拆卸代码。


我有相同的场景,对于我来说,SetupClass和TearDowNClass方法工作得很好

1
2
3
4
5
6
7
8
9
10
import unittest

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

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


对于python 2.5,当使用pydev时,这有点困难。Pydev似乎不使用测试套件,而是查找所有单独的测试用例并分别运行它们。

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

1
2
3
4
5
6
7
8
9
10
11
12
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方法,但我想用这个计数器可以做些什么。