pytest-picked实际检测的是git status中modified或untracked的python文件,默认不包含已staged但未commit的文件,需加--staged参数才纳入;它通过文件路径匹配测试文件,而非分析代码变更内容。

pytest-picked 依赖 git 状态,不是“未提交的代码”而是“未暂存/未提交的修改文件”
pytest-picked 实际上不识别“未提交的代码”,它只检查 git status 中标记为 modified、untracked 或 staged 的 Python 文件(默认只处理 modified 和 untracked),再从中提取关联的测试用例。如果你刚写完函数但没 git add,它能发现;但如果你已 git add 却没 git commit,它默认**不会运行对应测试**——除非显式加 --staged 参数。
- 它不扫描 AST 或 diff 内容,只靠文件路径匹配:找到被修改的源码文件(如
src/utils.py),然后按命名规则(如test_*.py或*_test.py)找同目录或tests/下的测试文件 - 它不分析哪行代码变了,所以改了非测试路径的代码(比如配置文件、README)不会触发任何测试
- 项目根目录必须是 git 仓库顶层(即运行
git rev-parse --show-toplevel有输出),否则报错Not a git repository
安装与基础运行:确保 pytest 和 git 环境就位
先确认你已有 pytest(>=6.0)和本地 git 仓库初始化完成。然后安装插件:
pip install pytest-picked
在项目根目录下直接运行:
pytest --picked
它会自动执行以下动作:获取所有 git status --porcelain 输出 → 过滤出 Python 源文件 → 反向查找测试模块 → 收集并运行这些测试。常见失败场景包括:
-
ModuleNotFoundError: No module named 'tests':说明它找到了被修改的源码,但按默认规则找不到对应测试文件(比如测试不在tests/下,或命名不规范) - 什么都没跑,终端只显示
collected 0 items:大概率是当前工作区没有被 git 跟踪的 Python 文件变更(例如你改的是.env或新写的draft.py但还没git add) - 报错
git command not found:系统 PATH 里没 git,或你在子目录下误执行命令(必须在 git 仓库根目录)
覆盖 staged 修改:加 --staged 才能测刚 git-add 的代码
默认情况下,pytest-picked 忽略已 git add 的文件——这是最常被忽略的行为。如果你刚 git add src/logic.py,想立刻验证改动是否破坏测试,必须显式启用 staged 支持:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
pytest --picked --staged
该参数会让它额外解析 git diff --cached --name-only,把暂存区里的 Python 文件也纳入检测范围。注意:
-
--staged不影响未暂存的修改,它只是“追加”暂存区文件到检测列表 - 如果同一文件既在工作区修改又在暂存区(即部分暂存),
--staged只关心暂存的部分,但 pytest-picked 仍以整个文件为单位匹配测试,不会做行级 diff 分析 - CI 场景慎用
--staged:在 CI 中通常没有暂存区(git clone后直接 checkout),该参数可能无效果
自定义测试发现逻辑:用 --test-path 和 --source-dir 控制范围
当项目结构不标准(比如测试文件散落在各模块内,或源码不在 src/)时,pytest-picked 可能找不到正确映射。此时需手动指定路径:
pytest --picked --test-path app/tests/ --source-dir app/
这两个参数改变它的“源码→测试”推导规则:
-
--test-path告诉它去哪找测试文件(默认是tests/和当前目录) -
--source-dir是源码根目录(默认是.),它据此计算被修改文件相对于源码根的路径,再拼接进测试路径查找 - 例如修改了
app/models/user.py,设--source-dir app/后,它会尝试导入app.tests.models.test_user或app/tests/models/test_user.py - 避免混用相对路径和绝对路径;推荐全用相对路径,且确保
--test-path目录可被 Python 导入(即含__init__.py或已加进PYTHONPATH)
路径配置错一个字符就会导致收集不到测试,建议先用 git status -s | grep '\.py$' 确认要测的文件路径,再比对 --source-dir 是否能正确截掉前缀。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










