pytest-watch未触发测试的主因是默认仅监听当前目录下.py文件,不递归子目录且不监听配置文件;需显式用--watch指定src、tests等路径,并确保工作目录、PYTHONPATH与pytest配置一致。

直接说结论:pytest-watch 能实现保存即测试,但默认不监听 .py 文件以外的改动,且需注意工作目录和 pytest 配置冲突问题。
为什么改了代码但 pytest-watch 没触发?
常见现象是修改 test_*.py 或 *_test.py 后无反应,本质是默认监听路径和文件类型不匹配。
- pytest-watch 默认只监听当前目录下的
.py文件,但若你在子目录(如src/或tests/)里改代码,它不会自动递归监听 —— 必须显式用--onchange或--runner配合--watch指定路径 - 它不监听
conftest.py、pyproject.toml或setup.py的改动,哪怕这些文件影响测试行为;需要手动加--watch conftest.py - 如果项目用了
pytest.ini或pyproject.toml里定义了testpaths,而pytest-watch启动时不在该路径下,会找不到测试 —— 建议始终在项目根目录运行
怎么正确启动并监听多目录?
用 --watch 多次指定路径是最可靠的方式,比依赖默认行为更可控。
- 监听源码和测试目录:
pytest-watch --watch src --watch tests --runner "pytest -xvs" - 想同时响应配置文件变化:
pytest-watch --watch src --watch tests --watch pyproject.toml --runner "pytest -xvs" - 避免每次输长命令,可写成
pyproject.toml中的脚本别名(注意:pytest-watch 不读取 pytest 配置里的addopts,所以-xvs必须写在--runner里)
遇到 ImportError 或 ModuleNotFoundError 怎么办?
这是最常被忽略的坑:pytest-watch 启动时的工作环境和普通 pytest 不同,PYTHONPATH 可能未生效。
立即学习“Python免费学习笔记(深入)”;
- 不要依赖 IDE 自动添加的源码路径;显式用
--onstart设置环境:pytest-watch --onstart "export PYTHONPATH=$(pwd)/src" --watch src --runner "pytest -xvs" - 更稳妥的做法是用
-m pytest替代直接调用pytest,并确保src/在sys.path中(例如通过pip install -e .安装开发包) - 如果用 Poetry,得先
poetry shell再运行 pytest-watch,否则虚拟环境隔离会导致导入失败
pytest-watch 已停更,现在该用什么?
官方仓库早在 2021 年就归档了,不再维护。虽然还能用,但 Python 3.11+ 和新版本 pytest(如 8.x)下偶发进程卡死或信号处理异常。
- 轻量替代:用
watchfiles+pytest组合,一行启动:watchfiles --filter "*.py" --on-change "pytest -xvs" src tests - 功能更强的替代:
ptw(pytest-watch 的 fork,修复了部分 bug)或entr(Unix/macOS 下极简:find src tests -name "*.py" | entr -r pytest -xvs) - 真正要长期用,建议把自动测试逻辑收敛进 Makefile 或 justfile,而不是依赖一个已停止维护的 CLI 工具
实际用起来,最大的复杂点不是命令怎么写,而是搞清“当前 shell 环境有没有把 src 加进 path”“pytest 配置里 testpaths 是不是和 watch 路径一致”“编辑器保存时是否真的落盘(有些编辑器用原子写入,临时文件名不匹配 *.py)”。这些细节不验证,光配命令没用。


















