Python 多个测试的单元测试设置/拆卸

Python 多个测试的单元测试设置/拆卸,python,unit-testing,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(sel

是否存在在测试场景开始/结束时启动的函数?每次测试之前/之后都会触发函数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都是单元测试,在我的所有场景中(包含许多测试),一个是第一个测试,另一个是最后一个测试。

从2.7(per)开始,您会得到
setUpClass
tearDownClass
,它们分别在给定类中的测试运行之前和之后执行。或者,如果在一个文件中有一组,则可以使用
setUpModule
tearDownModule
()


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

我有相同的场景,对我来说,setUpClass和tearDownClass方法工作得非常好

import unittest

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

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

对于Python2.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的
运行计数。然后在run方法中,检查并增加子testcase的
runCount
。这使得该类的
runCount
变量为0

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


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

这里有一个例子:3个测试方法访问一个共享资源,它只创建一次,而不是每次测试

导入单元测试
随机输入
类TestSimulateLogistics(unittest.TestCase):
共享资源=无
@类方法
def设置等级(cls):
cls.shared_resource=random.randint(1100)
@类方法
def拆卸类(cls):
cls.shared_资源=无
def测试_1(自身):
打印('test 1:',self.shared_资源)
def测试_2(自身):
打印('test 2:',self.shared_资源)
def测试_3(自身):
打印('test 3:',self.shared_资源)

有关更多信息,请访问哪个版本?unittest模块已经扩展,在Python 2.7.2.7中包含了模块设置和模块拆卸,还引入了setUpClass()和tearDownClass()类方法,这将使您在同一文件中有多个类,每个类都有自己的设置和拆卸。您也可以将其更新为可接受的答案,因为它显示了一个正确的示例,并且这些函数必须是classmethods才能工作,这在可接受的答案中没有提及。是。很好。setUpClass对所有三个测试用例只执行一个。
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")