我试图理解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连接对象都是类变量,不是吗?在
差异#1
第一种方法。
conn
是TestRethink
类的类成员。在在第二种方法(
unittest
方法)中,TestRethink
的每个子类都将有它自己的连接实例。在使用
@classmethod
时的差异示例:此代码输出:
^{pr2}$差异#2
unittest
将在设置子类期间处理异常,并将打印有关失败的详细信息,这将更容易调试测试失败的原因。在我建议使用} 模块,它有很好的API来处理fixture。在
unittest
方法,或者尝试使用^{主要区别在于执行的范围和顺序,类变量将在加载类本身时被定义和执行,而}调用,此时该类将被实例化(它的作用有点像构造函数)。在
setupClass()
方法将在运行测试时由{在您的最小示例中,这应该没有什么区别,但是如果您将
TestRethink
类的子类化,那么它就会。因为在第一种情况下,您将为所有子类共享一个DB连接,而在setup/teardown中,每个子类将有一个连接。在相关问题 更多 >
编程相关推荐