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

Posted

技术标签:

【中文标题】Python unittest 中的 setUp() 和 setUpClass() 有啥区别?【英文标题】:What is the difference between setUp() and setUpClass() in Python unittest?Python unittest 中的 setUp() 和 setUpClass() 有什么区别? 【发布时间】:2014-07-03 06:33:39 【问题描述】:

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

我想了解在setUp()setUpClass() 函数以及tearDown()tearDownClass() 中完成了哪些设置。

【问题讨论】:

【参考方案1】:

当您的班级中有多个测试方法时,差异就会显现出来。 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之前和之后@ 987654332@,而setUpClasstearDownClass 只出现一次,在整个测试用例的开头和结尾。

【讨论】:

顺序不应该是这样吗? : setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass 注意“.”在 tearDown 和没有“。”的前面。在 tearDownClass 前面 啊,抱歉,没发现。不,unittest 在其tearDown 顺利完成之前不会认为测试已通过。 所以每个方法 test1 和 test2 都应该有自己的 setUp 和 tearDown 集,对吧?在您的回答中, test1 没有任何 tearDown 方法,因此它应该打印默认输出(带有 . )。如果我错了,请纠正我。 答案中的输出是正确的。我直接从 unittest 的输出中粘贴了它。 setUptearDown 对每个 test 方法运行一次(在此示例中总共运行两次),但 setUpClasstearDownClass 各运行一次。【参考方案2】:

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

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

来自unittestdocumentation:

setUpClass()

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

@classmethod
def setUpClass(cls):
    ...

和:

setUp()

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

为什么要用一种方法而不是另一种方法来处理设置?

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

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

【讨论】:

以上是关于Python unittest 中的 setUp() 和 setUpClass() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

markdown Python unittest`setUp`继承

python自动化测试——unittest测试用例setup和teardown

如何从“python setup.py test”运行 unittest discover?

Selenium2+python自动化55-unittest之装饰器(@classmethod)

Python 的 unittest

Selenium2+python自动化55-unittest之装饰器(@classmethod)转载