DEBUG.WIKI
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

pytest.toml 已被加载,addopts 却没生效:检查是否缺少 [pytest]

pytest.toml 文件已被选中,顶层 addopts 却可能被当成空配置。补齐正确表头,核对空文件优先级与不同配置文件的表名。

迁移配置后,pytest 启动信息已经显示 configfile: pytest.toml,里面写的 addopts、testpaths 却没起作用。若选项直接放在 TOML 顶层,先补齐 [pytest] 表,不要因文件名正确就认定内容已被采用。

pytest 从 9.0 开始支持 pytest.toml。在可核对的 9.1.1 读取实现中,没有 [pytest] 时可能把这个文件当成空配置,顶层选项因此被忽略。后续开发代码已加入对部分顶层错误写法的明确诊断,但即使较新版本开始报错,正确配置位置也仍是 [pytest]。

TOML 语法有效,不代表 pytest 知道选项在哪里

下面的内容是合法 TOML,却缺少 pytest 所要求的表:

# pytest.toml:不要把选项放在顶层
addopts = ["-v"]
testpaths = ["tests"]

应改成:

# pytest.toml 或 .pytest.toml
[pytest]
addopts = ["-v"]
testpaths = ["tests"]

tests 是示例目录,按项目实际结构调整。不要把表名写成 [pytestt];也不要在 pytest.toml 中照搬 pyproject.toml 的 [tool.pytest]。

pytest 9 的 pyproject.toml 可以使用 [tool.pytest] 表达原生 TOML 类型;兼容 INI 配置风格时则使用 [tool.pytest.ini_options]。这些位置不是可以互换的文件头。跨版本项目要同时核对目标 pytest 是否支持选择的格式,而不是只改扩展名。

新的空文件也可能遮住旧配置

pytest.toml 与 .pytest.toml 的优先级高于其他配置文件,即使内容为空也可能被选中。因此,仓库里新建了一个只有注释的 pytest.toml,原来 pytest.ini 中的设置可能不再生效。

排查时看启动信息中的 rootdir、configfile,并检查编辑器或 CI 的工作目录、-c 参数。需要隔离配置选择时,可以显式指定待检查文件:

python -m pytest -c pytest.toml --collect-only

这会执行测试收集,可能导入 conftest.py、插件与测试模块;应在原本允许运行测试的开发环境中操作。确认配置路径后,再比较收集项目与详细输出是否符合预期。

testpaths 主要影响没有显式指定测试路径时的默认收集范围。若检查命令本身带了另一个文件路径,不能仅凭它收集了那个文件,就认定 testpaths 仍然失效。

分开检查文件选择和选项值

补上 [pytest] 后,可先用明显但无业务副作用的显示选项检查读取,例如示例里的 -v,再核对项目真正依赖的过滤、标记与测试目录。PYTEST_ADDOPTS、命令行选项或 -o 仍可能覆盖部分设置,应该保留实际启动命令一起比较。

这与“addopts 中的严格检查兼容参数被旧版本错误覆盖”是两条路径:这里是选项根本没进入正确配置表。只升级某个 strict 相关修复,不能修好缺失的 [pytest]。迁移完成后,确认命令行、编辑器和 CI 都选择同一份配置,再移除不再使用的旧配置,避免后续从另一个目录运行时又读取到不同设置。