几个测试的 Unittest setUp/tearDown

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

125991 次浏览

从2.7开始(每个 文件) ,您将得到分别在给定类中的测试运行之前和之后执行的 setUpClasstearDownClass。或者,如果在一个文件中有一组这样的文件,则可以使用 setUpModuletearDownModule(文件)。

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

对于 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方法,但是我想可以用这个计数器来做一些东西。

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


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")

想了解更多请访问 < a href = “ https://docs.Python.org/3/library/unittest.html # unittest.TestCase.setUpClass”rel = “ nofollow noReferrer”> Python 单元测试文件