--lf 能只运行上次失败用例,前提是 .pytest_cache/v/cache/lastfailed 文件存在且含有效 nodeid;若上次全通过、缓存被删或清空、ci 未保留缓存、nodeid 因重命名/移动/参数化变更,则 --lf 不生效。

pytest --lf 能只运行上次失败的用例,但前提是 pytest 有记录可查——它依赖 .pytest_cache/v/cache/lastfailed 文件,不是靠“记忆”或当前终端状态。
为什么 --lf 有时不生效?
最常见原因是缓存文件丢失或未生成。pytest 只在上一次运行中遇到失败时才会写入 lastfailed;如果上次全通过、或手动删了 .pytest_cache、或用了 --cache-clear,--lf 就没东西可读。
- 运行
pytest后检查是否存在.pytest_cache/v/cache/lastfailed(内容是 JSON 格式,键为测试节点 ID) - CI 环境里默认不保留缓存目录,需显式挂载或配置
--cache-dir -
--lf对pytest-xdist并行执行有兼容限制:必须搭配--dist=load或禁用分发,否则可能漏掉失败项
--lf 的真实匹配逻辑是什么?
它不按测试名字符串匹配,而是基于 pytest 内部的 nodeid(如 test_example.py::test_divide_by_zero)。只要该 nodeid 在缓存中存在,就触发运行——哪怕测试函数被重命名但文件路径没变,nodeid 也会变,旧缓存就失效。
- 重命名测试函数 →
nodeid改变 →--lf找不到对应项,跳过 - 移动测试到另一个文件 →
nodeid改变 → 同样跳过 - 加参数化(
@pytest.mark.parametrize)后,每个参数组合生成独立nodeid,缓存也按此粒度存储
如何配合 --lf 提高调试效率?
单独用 --lf 容易漏掉因依赖变更而新暴露的问题,建议组合使用:
-
pytest --lf --tb=short:缩短 traceback,聚焦错误位置 -
pytest --lf --maxfail=1:失败一个就停,避免后续干扰 -
pytest --lf --lf-failures-only(pytest ≥ 7.0):只运行明确失败过的,排除被跳过(skip/xfail)但曾失败的用例 - 开发时可 alias 成
alias ptlf='pytest --lf --tb=line',一行命令直奔问题
缓存文件本质是本地开发辅助机制,不能替代 CI 中的完整测试流程;它的可靠性完全取决于你是否让 pytest 有“上一次失败”的上下文——这点比参数本身更关键。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











