pytest命令行指定测试目录最直接:传什么路径就从哪找测试文件;testpaths仅在无命令行路径时生效,定义默认搜索起点,不覆盖显式路径,且各起点仍递归查找。

pytest 命令行指定测试目录:最直接的写法
直接在终端里跑 pytest 时,路径就是测试目录本身——不是“配置”,而是“执行目标”。你传什么路径,它就从那里开始找测试文件。
- 运行当前目录下所有测试:
pytest - 只跑
tests/目录:pytest tests/ - 同时跑多个目录:
pytest tests/ integration/ - 指定具体文件或函数:
pytest tests/test_api.py::test_login
注意:pytest 默认只识别 test_*.py 或 *_test.py 文件,且函数名要以 test_ 开头。路径末尾加不加 / 没影响,但别写成 tests/*.py —— 那是 shell 展开,不是 pytest 的 glob 匹配逻辑。
pytest.ini 中用 testpaths 控制默认搜索范围
testpaths 不是“强制只在这些目录里跑”,而是“当没给命令行路径时,从这些目录里找测试”。它只影响默认行为,不覆盖命令行显式传入的路径。
- 在项目根目录建
pytest.ini,内容如下:
[tool:pytest] testpaths = tests unit_tests
这样执行 pytest(不带参数)就会依次扫描 tests/ 和 unit_tests/;但如果你敲 pytest legacy/,它照样进 legacy/,完全忽略 testpaths。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
testpaths值之间用空格分隔,不能用逗号或换行 - 路径是相对于
pytest.ini所在位置的相对路径 - 如果目录不存在,pytest 会静默跳过,不会报错
常见错误:testpaths 不生效?先看配置文件名和位置
pytest 只认特定名字的配置文件,且优先级严格:命令行 > pyproject.toml > pytest.ini > tox.ini > setup.cfg。很多人写了 pytest.ini 却没生效,是因为:
- 文件名写成了
setup.py、config.ini或大小写错误(比如Pytest.ini) - 文件放在了子目录里,而你在父目录执行
pytest—— 它只向上查找,不向下搜 - 项目里存在
pyproject.toml,且里面定义了[tool.pytest.ini_options],那pytest.ini就被无视了 - 用
python -m pytest启动时,当前工作目录(pwd)决定配置文件查找起点,不是脚本所在目录
testpaths 和 pythonpath、addopts 搭配时的坑
testpaths 只管“去哪找测试文件”,不管“怎么导入它们”。如果测试文件里 import 了项目代码,而项目模块不在 Python 路径里,照样报 ModuleNotFoundError。
- 确保
pythonpath或addopts = --import-mode=importlib配置到位(尤其用src/结构时) -
testpaths和addopts = -xvs共存没问题,但别把路径塞进addopts—— 比如addopts = tests/是无效的,会被忽略 - Windows 下路径分隔符用
/或\都可以,但别混用;Linux/macOS 必须用/
真正容易被忽略的是:testpaths 不改变 pytest 的递归行为——它只是列出起点目录,每个起点内部仍会递归进入子目录找测试。所以 testpaths = tests 等价于 pytest tests/,而不是“只扫 tests/ 下一层”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










