pytest-check 是一个 pytest 插件,本质是绕过 Python 异常中断机制,将断言结果缓存并延迟报错;而内置 assert 一失败即抛 AssertionError 并终止函数执行。

pytest-check 是什么,它和内置 assert 有什么本质区别
它不是替代 assert,而是绕过 Python 的异常中断机制,把断言结果缓存起来,等用例结束再统一报错。内置 assert 一失败就抛 AssertionError,测试函数立刻终止;而 pytest-check 的 check.equal()、check.is_true() 这类函数失败只记录一条“软失败”,函数继续往下跑。
适合场景:一个测试里要校验多个独立检查点(比如页面上 5 个字段都要验证),不希望某个字段错就跳过其余校验。
注意:pytest-check 不改变 pytest 的用例粒度——整个函数仍是一个 test item,只是内部断言不中断执行。
怎么安装和启用 pytest-check
直接 pip 安装即可,无需额外配置插件开关:
立即学习“Python免费学习笔记(深入)”;
pip install pytest-check
在测试文件中导入后就能用,不需要 pytest_plugins 声明或 conftest.py 配置:
from pytest_check import check
常见误操作:
- 写成
import pytest_check然后调用pytest_check.check.equal()—— 会报AttributeError,必须用from pytest_check import check - 在非 pytest 环境(比如纯 Python 脚本)里运行含
check.xxx的代码,会提示pytest is not available,因为它依赖 pytest 的 hook 机制收集结果
check.equal() 和 assert equal() 在行为上有哪些关键差异
看这个例子:
def test_multiple_checks():
check.equal(1, 2) # 软失败,记录但不中断
check.equal("a", "b") # 再失败一次
assert 3 == 4 # 硬失败,执行到这里就停了
print("这行永远不会执行")
运行后你会看到两条 check 失败 + 一条 assert 失败,但 print 不会触发。
关键点:
-
check.equal(a, b)参数顺序和assert a == b一致,但不支持msg参数直接传字符串,得用check.equal(a, b, "custom msg") - 所有
check.xxx函数返回None,不能链式调用或参与逻辑判断 - 失败信息默认不显示实际值对比(不像 pytest 自带 assert 有 diff),需要手动加 msg 或配合
--tb=short看堆栈定位哪行 check 挂了
失败汇总在哪看,怎么避免被忽略
pytest 默认会在测试 summary 后单独输出一个 Failed Checks 区块,格式类似:
Failed Checks (2):
test_demo.py:5 check.equal(1, 2)
test_demo.py:6 check.equal("a", "b")
容易被忽略的地方:
- 如果测试本身也因其他原因失败(比如
KeyError),pytest 可能先报异常,Failed Checks区块会被折叠或看不到——建议先确保无非断言类异常 - CI 环境里日志滚动快,这个区块可能一闪而过;可在 pytest 命令加
--tb=no减少干扰,或用pytest --junitxml=report.xml导出 XML,里面<system-err>会包含 failed checks -
check不影响测试状态码:只要没硬失败,pytest 仍返回 0(成功),但实际有 soft fail——别依赖 shell $? 判断是否真通过
真正复杂的点在于:你得自己权衡哪些检查必须强中断(比如登录失败就不该继续测后续页面),哪些可以软检查(比如文案微调、时间戳精度)。混用 assert 和 check 时,逻辑边界稍不清晰,就容易漏掉关键阻断点。


















