pytest -c 指向不存在的文件,为什么换后缀就开始跑测试
pytest 9.1.1 对不存在的 -c 配置路径按后缀表现不同,可能直接运行空配置测试。启动前验证必需文件,并核对实际配置及测试选择。
CI 明确传了 pytest -c nope.xyz,文件根本不存在,测试却照常开始;把后缀换成 .ini 或 .toml,又直接出现 FileNotFoundError。pytest 9.1.1 对显式配置路径的验证不一致,不能把“命令跑起来”当成它已读到指定配置。
在这个版本里,显式 -c 路径会交给按后缀分发的配置加载器。已识别格式尝试打开文件,从而暴露文件不存在;未知后缀可能不尝试打开,得到空配置后继续。于是同一个路径拼写错误,可能产生完全不同的结果。
先确认路径,再让 pytest 接手
检查 CI 当前工作目录、实际 -c 参数,以及配置文件是否已被检出或复制。-c 指向的是具体文件,不是项目目录;相对路径按调用位置解释,不能只看编辑器里打开了哪一份配置。
流水线确实依赖固定配置时,可以在启动入口先检查它是一个文件。下面是 Python 启动脚本示例,假定项目真实配置为 pytest.ini,测试目录为 tests:
from pathlib import Path
import subprocess
import sys
config = Path("pytest.ini")
if not config.is_file():
raise SystemExit("Required pytest.ini is missing")
result = subprocess.run([
sys.executable, "-m", "pytest",
"-c", str(config.resolve()), "tests",
])
raise SystemExit(result.returncode)
路径和测试目录应按项目调整。保留返回码,让 CI 仍能发现测试失败。这段会真正收集并运行测试,插件、conftest 和测试代码可能执行初始化,只适合项目原来允许的测试环境。
文件存在检查不验证配置内容。仍需核对 pytest 的启动信息和实际选项,例如预期的标记、警告策略及测试选择。把未知后缀改成一个存在的空文件,可能仍丢掉所有原设置,不能作为修复。
开发分支的改进尚不等于正式版本
截至 2026 年 10 月 26 日,当前正式 pytest 是 9.1.1。开发实现已经对缺失路径给出清晰的用法错误,也会拒绝目录和无法加载的配置格式;这项变化计划进入后续特性版本,不能把它说成 9.1.1 已修复。
现在可以先在自己的启动边界阻止缺失文件,继续使用正式依赖。后续正式版本可用时,再核对项目实际格式与异常退出码,不需要为这个路径错误直接安装主分支。
这与配置文件存在却缺少正确 TOML 表、或自定义路径参数影响 conftest 发现不同。不要为了消除 traceback 删除 -c,让测试悄悄改用另一份自动发现配置。
验收应包含存在的有效文件、不存在的已识别后缀、不存在的未知后缀和误传目录。失效路径必须在测试开始前失败;有效配置下则核对收集范围及原有严格规则仍生效。测试数量相同并不能证明警告过滤等配置也被读取。


