pytest-incremental 已停止维护且不兼容现代 pytest(≥7.0)和 python 3.11+,因依赖被移除的私有 api(如 _pytest.python.get_real_func)和过时 hook 签名;其基于 .pyc 时间戳的机制在 ci、windows 及 git 环境下不可靠,也不支持 xdist 或 conftest.py 变更感知;推荐改用 pytest 原生 --lf/--nf 组合或持续维护的 pytest-testmon。

pytest-incremental 本身已停止维护,且不兼容现代 pytest(≥7.0)和 Python 3.11+,直接使用会触发 ImportError: cannot import name 'get_real_func' from 'pytest.python' 等错误。它不是当前可行的增量测试方案。
为什么 pytest-incremental 现在跑不起来
该插件依赖 pytest 内部私有 API(如 _pytest.python.getrealfunc),而这些在 pytest 6.3+ 中被移除或重构;同时它没有适配 pytest 的新 hook 签名(例如 pytest_collection_modifyitems 参数变更)。即使降级到 pytest 5.4.3 + Python 3.8,也常因路径解析逻辑缺陷漏测或误报。
- 常见错误:
AttributeError: 'Function' object has no attribute '_obj' - 它通过比对 .pyc 时间戳判断“修改”,但 CI 环境无 pyc、Windows 文件系统时间精度低、Git 检出重置时间戳,导致行为不可靠
- 不支持 pytest-xdist 并行,也不识别 conftest.py 变更对下游测试的影响
替代方案:用 pytest --lf 和 --nf 快速落地
pytest 原生支持基于上一次运行结果的轻量级增量逻辑,无需额外插件,稳定且兼容所有版本。
-
pytest --lf(last-failed):只运行上次失败的测试,适合调试阶段快速复现问题 -
pytest --nf(new-first):把新发现的测试(如新增文件/函数)排在最前执行,配合--lf可组合出近似“改哪跑哪”的效果 - 实际工作流:
pytest --lf --nf -x—— 先跑失败项,再跑新增项,任一失败即停
注意:--lf 依赖 pytest 在当前目录生成的 .pytest_cache/v/cache/lastfailed,确保不 gitignore 它;若想清空状态,删掉整个 .pytest_cache 目录即可。
真正可靠的增量:结合 git diff + pytest -k
如果你明确知道改了哪些模块(比如只动了 src/utils.py),可以用 Git 找出变更文件,再映射到对应测试:
git diff --name-only HEAD~1 | grep '\.py$' | sed 's/^src\//test_/; s/\.py$/_test.py/' | xargs -r pytest -k
说明:
-
HEAD~1是上一次提交,可替换为origin/main或具体分支名 -
sed规则按常见项目结构假设:源码在src/,测试在test/下同名路径 +_test.py后缀 - 若测试与模块名不严格对应,改用
grep -E 'test_.*\.py' | head -n1等启发式匹配 - 该命令不会自动处理 conftest.py 或 fixtures 变更,需人工加一层
git diff --name-only HEAD~1 | grep conftest.py判断是否全量回归
CI 场景下建议用 pytest-testmon
testmon 是目前唯一仍在积极维护、能做代码级增量(基于 AST 分析函数依赖)的方案,它通过字节码监控和依赖图跳过未受影响的测试。
- 安装:
pip install pytest-testmon - 首次运行:
pytest --testmon(会生成.testmondata) - 后续只需:
pytest --testmon,它自动识别被修改函数及调用链上的测试 - 注意:禁用
__pycache__清理、避免PYTHONDONTWRITEBYTECODE=1,否则无法跟踪 - 缺点:首次启动略慢(需构建依赖图),且对动态导入(
importlib.import_module)、monkeypatch 场景覆盖有限
testmon 的“增量”是语义级的——它真正在意的是“这段测试代码有没有可能被改过的函数影响”,而不是文件时间戳。这点和已废弃的 pytest-incremental 有本质区别。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











