繁体   English   中英

Unittest setUp/tearDown 用于多个测试

[英]Unittest setUp/tearDown for several tests

是否有在测试场景开始/结束时触发的函数? 在每次测试之前/之后都会触发 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 开始(根据文档),您将分别在给定类中的测试运行之前和之后执行setUpClasstearDownClass 或者,如果您在一个文件中有一组,则可以使用setUpModuletearDownModule文档)。

否则,您最好的选择可能是创建您自己的派生TestSuite并覆盖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()

这是一个示例: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)

对于 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 的runCount 。然后在 run 方法中,子测试用例的runCount被检查并递增。 这使得runCount变量为 0。

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

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

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 单元测试文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM