Python的unittes中的类fixture

2024-09-30 20:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Python的unittest模块中的class fixtures。为了加快测试速度,我想在每个类中创建一个“昂贵的”连接对象。乍一看,我想这样做:

import unittest
import rethinkdb as r

class TestRethink(unittest.TestCase):
    conn = r.connect('localhost', 28016)

    def test_table_list(self):
        r.table_list().run(self.conn)

if __name__ == "__main__":
    unittest.main()

然而,从文档来看,人们应该这样做:

^{pr2}$

这两种方法有什么区别?在这两种情况下,rejectDB连接对象都是类变量,不是吗?在


Tags: 模块对象importselfmainastableunittest
2条回答

差异#1

第一种方法。connTestRethink类的类成员。在

在第二种方法(unittest方法)中,TestRethink的每个子类都将有它自己的连接实例。在

使用@classmethod时的差异示例:

class A(object):
    @classmethod
    def setup(cls):
        cls.conn = 'my connection for %r' % cls

class B(A):
    pass

class C(A):
    pass


# setup the tests
B.setup()
C.setup()

b = B()
c = C()
print(b.conn)
print(c.conn)

此代码输出:

^{pr2}$

差异#2

unittest将在设置子类期间处理异常,并将打印有关失败的详细信息,这将更容易调试测试失败的原因。在

我建议使用unittest方法,或者尝试使用^{}模块,它有很好的API来处理fixture。在

What is the difference between the two approaches? In both cases the RethinkDB connection object is a class variable, isn't it?

主要区别在于执行的范围和顺序,类变量将在加载类本身时被定义和执行,而setupClass()方法将在运行测试时由{}调用,此时该类将被实例化(它的作用有点像构造函数)。在

在您的最小示例中,这应该没有什么区别,但是如果您将TestRethink类的子类化,那么它就会。因为在第一种情况下,您将为所有子类共享一个DB连接,而在setup/teardown中,每个子类将有一个连接。在

相关问题 更多 >