是否有在测试场景的开头/结尾触发的函数?函数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是单元测试并在我的所有场景中传播(包含许多测试),一个是第一个测试,另一个是最后一个测试。
答案 0 :(得分:121)
从2.7(每the documentation)开始,你得到的setUpClass
和tearDownClass
分别在给定类的测试之前和之后执行。或者,如果您在一个文件中包含一组,则可以使用setUpModule
和tearDownModule
(documentation)。
否则,您最好的选择可能是创建自己的派生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