pytest中的assert断言
在 pytest
中,虽然底层仍使用 Python 原生的 assert
语句,但框架通过重写断言机制提供了“两种”不同层次的断言体验,通常被概括为:
1. 普通断言(Plain assert)
直接写 Python 原生的 assert <表达式>
,pytest 会在失败时自动重写断言信息,给出详细的左值、右值、中间变量等上下文。
示例:
def test_plain():a = 1b = 2assert a + b == 4 # 失败时 pytest 会打印出 3 != 4
2. 辅助断言(Assertion helpers)
利用 pytest 自带的辅助函数(或第三方插件如 pytest-check
)把多个断言打包、延迟报告,或提供领域专用的比较语义。
常见内置辅助:
pytest.raises(ExpectedException)
—— 断言代码块抛指定异常pytest.warns(UserWarning)
—— 断言代码块发出指定警告pytest.approx(value, rel=1e-6, abs=1e-12)
—— 浮点近似比较
示例:
import pytestdef test_helpers():with pytest.raises(ZeroDivisionError):1 / 0assert 3.1415 == pytest.approx(3.14, rel=1e-2)
总结:
“两种断言方式”并不是语法上两种关键字,而是指
a) 直接用 assert
+ pytest 的自动重写;
b) 借助 pytest 提供的上下文管理器/辅助函数来完成更复杂的断言需求。
assert断言失败
在 pytest 里写 assert
时,一旦条件为 False,pytest 会立即:
(1)抛出 AssertionError
(测试因此失败)。
(2)把失败的断言语句做“重写”,在终端里给出非常详细的上下文,例如
assert a + b == 4
失败时会看到
> assert a + b == 4
E assert 3 == 4
E + where 3 = 1 + 2
变量值、中间表达式、列表/字典 diff 都会列出来。
(1)该测试函数终止,后续代码不再执行;pytest 把它标记为 FAILED(一个 F
)。
(2)继续跑其余测试,最终报告里会统计失败条数,并给出失败用例的 traceback、stdout、stderr 等。
总结:assert 失败 → 测试当场失败,pytest 打印详细诊断,函数中断,但整个会话继续。