pytest 9 提示自定义参数无法识别,先把文件路径参数改成等号写法
自定义选项的文件路径值可能影响 pytest 初始 conftest 发现。明确测试目录并采用等号参数,核对收集范围和实际参数值。
pytest 9 提示自定义参数无法识别,先把文件路径参数改成等号写法
conftest.py 明明注册了 --sut-json、--db 等参数,pytest 却提示 unrecognized arguments,而且只在 CI 失败、本地正常。遇到 pytest 9 升级后的这类情况,先检查自定义参数有没有使用“选项名 空格 文件路径”的写法。
这个问题在 pytest 9.0.0、Linux、Python 3.13.7 的环境中出现过:测试目录下的 conftest.py 没有及时加载。如果参数值对应的文件只在 CI 容器内存在,本地和 CI 的结果就可能不同。可以先明确给出测试目录,再让自定义参数名和值写在同一个参数中。
例如原命令是:
python -m pytest --sut-json /path/to/stuff.json --server-ip 127.0.0.1
可以先在实际项目中改为:
python -m pytest tests/ --sut-json=/path/to/stuff.json --server-ip=127.0.0.1
这里的 tests/ 应换成存放项目 conftest.py 和测试的真实目录。SQLAlchemy 的目录名是 test/,不要照搬别人的路径。使用等号后,路径不再作为独立的命令行 token 出现;明确测试目录则为初始 conftest 发现提供了正确入口。
为什么文件存在会改变结果
pytest 需要先发现并加载初始 conftest.py,才能知道其中 pytest_addoption 注册了哪些自定义选项。但在这个发现阶段,自定义选项还没有全部注册,命令行上的独立路径值可能被当作测试路径锚点。
如果值是一个实际存在的文件,pytest 可能围绕那个文件寻找 conftest,而没有先加载真正测试目录中的配置。后续解析时,多个自定义选项一起变成“未知参数”。文件不存在时,又可能采用另一条发现路径。这能解释为什么修改输出文件名、删除文件或从不同工作目录运行后,错误看起来忽然消失。
判断时可以对比三条命令,路径和值保持不变:
python -m pytest --sut-json /path/to/stuff.json
python -m pytest --sut-json=/path/to/stuff.json
python -m pytest tests/ --sut-json=/path/to/stuff.json
若后两条能通过参数解析,而第一条失败,就值得检查本次 conftest 发现问题。不要为了验证删掉生产配置文件;在临时目录中复制一份测试所需样本,保留“文件存在”这一条件即可。
确认参数注册位置也很有用。自定义选项应在初始加载的 conftest 或插件的 pytest_addoption 中注册,例如:
def pytest_addoption(parser):
parser.addoption("--sut-json", action="store")
修改命令后,先运行 --collect-only,确认收集到的是预期目录和数量;然后正常执行测试,并检查代码通过 request.config.getoption("--sut-json") 读到的仍是正确文件路径。只消除参数解析错误而误收集另一组测试,并不能证明问题已解决。
目前没有确认首次完整修复的版本,不能只靠更换到某个后续版本来保证消除这个问题。对仍使用相关 pytest 9 调用方式的项目,可以将显式测试目录和等号参数写进 CI 脚本、tox 命令或任务入口,减少宿主文件状态带来的差异。
这条诊断针对自定义参数注册在测试目录 conftest、参数值又可能被解释为路径的情况。参数拼错、插件未安装、工作目录选错也会产生同样的错误文本;如果改写命令无效,应沿实际加载的配置和插件继续检查。


