首页/开发/软件测试速查/pytest 断言内省
自动化测试66 条

pytest 断言内省

pytest 允许直接写 assert,失败时自动展开表达式内省:标量比较显示两侧值,容器比较显示差异项;无需记忆专门的断言方法名。

软件测试速查开发更新于 2026-10-13

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,把注意力放在预期结果上。

易错点

  • 把断言封装到辅助函数再调用,报错只指向辅助函数内部行号
  • 断言里写复杂表达式,失败信息需要人再做一次心算
  • 断言只查返回值不查副作用,落库与状态问题漏检
  • 对浮点用等号比较,偶发精度失败
  • 把多个独立结论塞进一条断言,失败后无法分辨是哪部分不满足
  • 断言结果依赖导入顺序或环境变量,换个执行环境即失败

数据来源与参考

  • pytest 官方文档:Assertions(assertion rewriting)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌