我们在一个单独的python文件中定义了所有自定义断言,该文件不是测试模块.
例如:
custom_asserts.py
class CustomAsserts(object):
def silly_assert(self, foo, bar):
assert foo == bar , 'some error message'
Run Code Online (Sandbox Code Playgroud)
如果我们assert直接在测试中使用,我们将获得有关AssertionError的额外信息,这非常有用.
在测试中直接使用断言的输出:
> assert 'foo' == 'bar', 'some error message'
E AssertionError: some error message
E assert 'foo' == 'bar'
E - foo
E + bar
Run Code Online (Sandbox Code Playgroud)
但我们发现,如果我们调用我们在单独模块中定义的断言方法,则不会显示额外信息.
from custom_asserts import CustomAsserts
asserts = CustomAsserts()
def test_silly():
asserts.silly_assert('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)
运行测试后输出:
> assert 'foo' == 'bar', 'some error message'
E AssertionError: some error message
Run Code Online (Sandbox Code Playgroud)
我们还在pytest docs中发现了这一点:高级断言内省
pytest只重写由其测试收集过程直接发现的测试模块,因此在支持模块中断言,这些模块本身不是测试模块,不会被重写.
所以我的问题是,有没有办法让pytest像测试模块那样对其他模块执行相同的断言重写?或者有任何hacky方式来实现这一目标?