为何pytest会屏蔽嵌套相等断言语句?如何解决?
原因分析
pytest默认会对断言语句做重写(assert rewriting),目的是生成更友好的错误提示,比如展示预期值和实际值的差异。但这种重写有范围限制:
- 仅作用于测试函数直接定义的断言,以及被标记为断言函数的代码。
- 对于普通自定义函数内的断言,pytest不会递归进行重写。当这类断言失败时,pytest只能追踪到测试函数调用该自定义函数的位置,无法解析断言内的表达式(如
1 == 0)来保留你自定义的错误消息,反而会用自己生成的对比提示覆盖。
而assert False是特例:它是简单的布尔断言,无需解析复杂比较逻辑,pytest会直接保留原始错误消息。
解决办法
1. 用pytest.fail()替代普通断言
如果自定义函数用于校验,直接调用pytest.fail()抛出明确错误:
import pytest def assert_equality(): if 1 != 0: pytest.fail('pytest will display this message now')
2. 标记自定义断言函数需重写
在函数上添加@pytest.mark.assertion装饰器(需pytest 7.0+版本),告诉pytest对该函数内的断言进行重写:
import pytest @pytest.mark.assertion def assert_equality(): assert 1 == 0, 'pytest will display this message now'
3. 全局禁用断言重写
在项目根目录创建pytest.ini,添加以下配置关闭重写(不推荐,会丢失pytest默认的友好提示):
[pytest] assert_rewrite = False
内容的提问来源于stack exchange,提问作者DiscOH
相关产品推荐
相关产品推荐

