Unittest setUp / tearDown用于几个testing

在testing场景的开始/结束处是否有一个函数被触发? setUp和tearDown函数在每次testing之前/之后被触发。

我通常想这样做:

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是unit testing,并在我的所有场景(包含很多testing)中进行传播,一个是第一个testing,另一个是最后一个testing。

从2.7(根据文档 ),您可以分别获得setUpClasstearDownClass ,它们分别在给定类中的testing之前和之后执行。 或者,如果你在一个文件中有一组文件,你可以使用setUpModuletearDownModule ( documentation )。

否则,你最好的select可能是创build你自己的派生TestSuite并重写run() 。 所有其他调用将由父级处理,并且运行会调用您的设置和拆卸代码来调用父级的run方法。

我有相同的场景,对于我setUpClass和tearDownClass方法完美的作品

 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不使用testing套件,而是find所有单独的testing用例,并分别运行它们。

我的解决scheme是使用这样的类variables:

 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 )inheritance时,你也将inheritance0的runCount 。然后在run方法中,子testcase的runCount被检查和递增。 这使这个类的runCountvariables为0。

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

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