Python unittest中的setUp()和setUpClass()有什么区别?


99

setUp()setUpClass()Python unittest框架之间有什么区别?为什么设置会以一种方法而不是另一种方法处理?

我想了解什么设置的一部分在完成setUp()setUpClass()功能,以及与tearDown()tearDownClass()

Answers:


147

当您的类中有多个测试方法时,差异就会显现出来。setUpClasstearDownClass一旦被全班运行; setUptearDown在每种测试方法之前和之后运行。

例如:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

运行此测试时,它会打印:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(该点(.)是unittest的默认输出时,测试通过)观察到setUptearDown之前和之后出现test1 test2,而setUpClasstearDownClass只出现一次,在整个测试案例的开始和结束。


命令不应该是这个吗?:setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
Jai Sharma

注意“。” 在tearDown和缺少“。”之前 在tearDownClass面前
Jai Sharma'Dec

啊,对不起,没发现。不,unittest在测试tearDown没有意外完成之前,它不认为测试已通过。
本杰明·霍奇森

因此,每个方法test1和test2都应具有自己的setUp和tearDown集,对吗?在您的答案中,test1没有任何tearDown方法,因此它应该已打印默认输出(带有。)。如我错了请纠正我。
贾伊·夏尔马

1
答案中的输出是正确的。我直接从unittest的输出中粘贴了它。setUptearDown各自一次为每一个运行test方法(总共在这个例子中这样的两倍),但setUpClasstearDownClass只是一次每个运行。
本杰明·霍奇森

15

setUp()setUpClass()Python unittest框架之间有什么区别?

主要区别(如本杰明·霍奇森(Benjamin Hodgson)的回答中所述)是setUpClass仅一次调用,即在所有测试之前,而setUp在每次测试之前均被调用。(注意:这同样适用于其他xUnit测试框架中的等效方法,而不仅仅是Python的方法unittest。)

unittest 文档中

setUpClass()

在运行单个类中的测试之前调用的类方法。使用类作为唯一参数调用setUpClass,并且必须将其装饰为classmethod():

@classmethod
def setUpClass(cls):
    ...

和:

setUp()

调用准备测试夹具的方法。在调用测试方法之前立即调用该方法。除了AssertionError或SkipTest之外,此方法引发的任何异常都将被视为错误而不是测试失败。默认实现不执行任何操作。

为什么设置会以一种方法而不是另一种方法处理?

问题的这一部分尚未回答。根据我对Gearon回答的评论,该setUp方法适用于所有测试通用的灯具元素(以避免在每个测试中重复该代码)。我发现这通常很有用,因为删除重复项(通常)可以提高可读性并减少维护负担。

setUpClass方法适用于昂贵的元素,您只需要执行一次即可,例如打开数据库连接,在文件系统上打开临时文件,加载共享库以进行测试等。在每次测试之前进行此类操作会使速度降低测试套件太多,所以我们在所有测试之前只做一次。测试的独立性略有下降,但在某些情况下是必要的优化。可以说,在单元测试中不应该这样做,因为通常可以在不使用真实内容的情况下模拟数据库/文件系统/库/任何东西。因此,我发现这setUpClass几乎是不需要的。但是,在需要测试上述示例(或类似示例)时很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.