如何实现 xunit 风格的设置¶
本节描述了一种经典且流行的方式,说明如何按每个模块/类/函数为基础实现固件(设置和拆除测试状态)。
注意
虽然这些设置/拆除方法对于来自 unittest
或 nose
背景的人来说很简单且很熟悉,但你也可以考虑使用 pytest 更强大的 固件机制,它利用依赖注入的概念,允许采用更模块化且更可扩展的方法来管理测试状态,尤其适用于大型项目和功能测试。你可以在同一文件中混合使用这两种固件机制,但 unittest.TestCase
子类的测试方法不能接收固件参数。
模块级设置/拆除¶
如果你在单个模块中有多个测试函数和测试类,则可以选择实现以下固件方法,这些方法通常会对所有函数调用一次
def setup_module(module):
"""setup any state specific to the execution of the given module."""
def teardown_module(module):
"""teardown any state that was previously setup with a setup_module
method.
"""
从 pytest-3.0 开始,module
参数是可选的。
类级设置/拆除¶
类似地,以下方法在类的所有测试方法调用之前和之后在类级别调用
@classmethod
def setup_class(cls):
"""setup any state specific to the execution of the given class (which
usually contains tests).
"""
@classmethod
def teardown_class(cls):
"""teardown any state that was previously setup with a call to
setup_class.
"""
方法和函数级设置/拆除¶
类似地,以下方法在每次方法调用前后调用
def setup_method(self, method):
"""setup any state tied to the execution of the given method in a
class. setup_method is invoked for every test method of a class.
"""
def teardown_method(self, method):
"""teardown any state that was previously setup with a setup_method
call.
"""
从 pytest-3.0 开始,method
参数是可选的。
如果你愿意直接在模块级别定义测试函数,则还可以使用以下函数来实现固件
def setup_function(function):
"""setup any state tied to the execution of the given function.
Invoked for every test function in the module.
"""
def teardown_function(function):
"""teardown any state that was previously setup with a setup_function
call.
"""
从 pytest-3.0 开始,function
参数是可选的。
备注
每个测试过程可以多次调用设置/拆除对。
如果相应的设置函数存在且失败/被跳过,则不会调用拆除函数。
在 pytest-4.2 之前,xunit 风格函数不遵守固件的作用域规则,因此有可能,例如,在会话作用域的自动使用固件之前调用
setup_method
。现在,xunit 风格函数已与固件机制集成,并遵守调用中涉及的固件的适当作用域规则。