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

162
Python的unittest框架中,setUp()setUpClass()有什么区别?为什么会在其中一个方法中处理设置?
我想了解在setUp()setUpClass()函数中分别完成了哪些设置,以及tearDown()tearDownClass()的作用。
4个回答

234

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


顺序不应该是这样吗?: setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass - Jai Sharma
注意 tearDown 方法前面有".",而 tearDownClass 方法前面没有 "."。 - Jai Sharma
2
啊,抱歉,我没注意到。不,unittest认为测试只有在其tearDown顺利完成后才算通过。 - Benjamin Hodgson
那么test1和test2方法应该各自有自己的setUp和tearDown方法,对吗?在你的回答中,test1没有任何tearDown方法,因此它应该打印默认输出(带有“.”)。如果我错了,请纠正我。 - Jai Sharma
1
答案中的输出是正确的。我直接从unittest的输出中复制粘贴的。setUp和tearDown分别为每个test方法运行一次(因此在此示例中总共运行两次),但setUpClass和tearDownClass仅运行一次。 - Benjamin Hodgson

34

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

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

来自unittest 文档:

setUpClass()

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

@classmethod
def setUpClass(cls):
    ...

和:

setUp()

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

为什么要在一个方法中处理设置而不是另一个方法中?

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

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


1
在Python的unittest框架中,setUp()setUpClass()方法用于在运行测试之前设置测试环境。这两种方法之间的主要区别是:
- setUp()方法:在每个测试方法运行之前调用,为每个单独的测试方法设置测试环境。 - setUpClass()方法:在整个类中的所有测试运行之前调用一次,为整个类设置测试环境。
以下是一些使用setUpClass()而不是setUp()的示例:
1. 如果您需要创建一个数据库连接或Web驱动程序,该连接或驱动程序将被该类中的所有测试使用。 2. 如果您需要将一些初始数据加载到数据库中。 3. 如果您需要设置一些全局配置选项。
一般来说,你应该使用setUpClass()来执行只需要在类中的所有测试运行之前执行一次的任务。你应该使用setUp()来执行在每个单独的测试方法运行之前需要执行的任务。 tearDown()tearDownClass()方法用于在测试运行后拆除测试环境。tearDown()方法在每个测试方法运行后调用,tearDownClass()方法在类中的所有测试运行后调用。这些方法用于清理测试所使用的任何资源,例如数据库连接或网络驱动程序,并将测试环境重置为初始状态。
希望对你有所帮助!

0
如上所述,setup()和 teardown()将在每个测试后和前运行。但是 SetupClass()和 TearDownClass()仅针对整个类运行一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接