何时应该使用setUpClass和__init__?

17

这两种方法之间是否存在运行时逻辑差异?或者任何行为差异?
如果没有,那么我应该忘记 __init__,只使用 setUpClass,将unittest类视为命名空间,而不是语言的面向对象编程范例?

1个回答

22

两者有很大的不同。

setUpClass是一个类方法,因此只能设置类属性。

它们也在不同的时间调用。测试运行程序为每个测试创建一个新实例。如果您的测试类包含5个测试方法,则会创建5个实例,并调用__init__ 5次。

setUpClass通常仅被调用一次。(如果打乱测试顺序并且来自不同类的测试方法交错,setUpClass可能会被多次调用,使用tearDownClass进行适当清理即可避免该问题)。

此外,测试运行程序通常在测试运行开始时创建所有测试实例;这通常很便宜,因为测试实例不持有(太多)状态,因此不会占用太多内存。

作为经验法则,您不应该使用__init__。使用setUpClass创建在所有测试之间共享的状态,并使用setUp创建每个测试的状态。 setUp在运行测试之前调用,因此可以避免在需要测试之前建立大量占用内存的状态。


有没有钩子可以在单元测试开始运行时运行代码?像模块级别的钩子一样?我想要加载一些昂贵的数据,并且在Py3升级后调用多进程时会收到有关在__main__之外调用多进程的警告,但我不想延迟到setUpClass被调用。 - DylanYoung
我还读到,由于支持fork(不需要使用不同的__name__调用模块),这个特定的警告实际上根本不应该在Unix系统上出现,但它在OSX上显示。 Martijn,你有什么见解吗? - DylanYoung
1
@DylanYoung 你可以随时使用unittest.main()来控制测试何时开始。或者使用setUpModule()tearDownModule()钩子 - Martijn Pieters
谢谢Martijn!setUpModuletearDownModule完美地完成了任务。不知道我怎么错过了这些。 - DylanYoung

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