pytest 断言内省是什么
pytest 允许直接写 assert,失败时自动展开表达式内省:标量比较显示两侧值,容器比较显示差异项,无需记忆专门的断言方法名。断言重写(assertion rewriting)机制让普通 assert 也能给出结构化报告,这是 pytest 被广泛采用的原因之一。
基本信息
| 写法 | 直接使用 assert 表达式,无需引入断言库 |
|---|---|
| 内省 | 标量显示左右值与运算符;容器显示差异元素 |
| 机制 | assertion rewriting 在加载测试模块时重写断言实现 |
| 适用范围 | 测试模块与 conftest 中的断言会被重写 |
| 配套断言 | pytest.raises 校验异常、pytest.approx 处理浮点比较 |
断言示例
断言示例
def test_members():
names = ["alice", "bob"]
assert "carol" in names # 失败时展示容器内容
def test_diff():
assert {"a": 1, "b": 2} == {"a": 1, "b": 3} # 展示差异项
def test_close():
from pytest import approx
assert 0.1 + 0.2 == approx(0.3) # 浮点比较用容差典型使用场景
- 日常单元测试:直接断言返回值与状态,失败信息自带上下文。
- 容器比对:列表、字典差异直接展开,省去手工打印。
- 浮点场景:用 approx 做容差比较,避免精度误报。
- 异常路径:用 pytest.raises 断言异常类型与消息。
- 评审:断言即业务规则,评审人无需理解自定义断言库。
- 迁移成本:从 unittest 迁移过来时断言样板更少。
断言方式对照
| 写法 | 适用 | 要点 |
|---|---|---|
| assert a == b | 常规比较 | 失败展示两侧值 |
| assert x in y | 成员判断 | 展示容器与元素 |
| pytest.raises | 异常路径 | 断言类型与消息 |
| approx | 浮点比较 | 按容差而不按等号 |
内省由 assertion rewriting 提供;在非测试模块里直接使用 assert 不会得到同样的报错展开。
断言失败信息可以补充上下文:复杂判断先赋值再断言,或附断言说明字符串,报告更易读。
断言可附说明字符串:assert 表达式后接一句说明,失败报告会带上这句话,业务语义更清楚。
练习建议
- 先写断言再补实现细节:内省让初学者不必先学断言库 API,把注意力放在预期结果上。