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(根据文档 ),您可以分别获得setUpClass
和tearDownClass
,它们分别在给定类中的testing之前和之后执行。 或者,如果你在一个文件中有一组文件,你可以使用setUpModule
和tearDownModule
( 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
被检查和递增。 这使这个类的runCount
variables为0。
这意味着setUpClass
只会在每个类中运行一次,而不是每个实例一次。
我还没有使用tearDownClass
方法,但是我想用这个计数器可以做些什么。