DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

pytest 的 strict 选项写在 addopts 却失效,检查完整参数解析后的覆盖

pytest 解析 addopts 后未应用 ini 覆盖时会忽略严格选项,应采用修复版本并分别验证未知标记与未知配置失败。

项目在 addopts 中写了 --strict-markers --strict-config,测试里拼错标记、配置里多了未知选项,pytest 9.0.x 却只警告并继续通过,要检查兼容选项转成 ini 覆盖的时机。此时选项名字合法,单纯注册拼错的标记会隐藏错误,而没有恢复严格检查。

pytest 9 把这些命令行兼容选项映射为 ini 设置。addopts 在初步发现配置后才参与完整参数解析,旧路径生成了覆盖值,却没有重新写回 ini 配置并清除读取缓存。后续 getini() 仍看见默认的非严格值,所以只显示警告。

pytest 9.1.1 包含修复:完整解析含 addopts 的参数后,应用生成的覆盖并清理 ini 缓存。针对 pytest 9 项目,也可以使用正式的 strict_markers、strict_config 配置项清楚表达意图。

[pytest]
strict_markers = true
strict_config = true
markers =
    smoke: small smoke tests

采用修复版本后,还应复验旧 addopts 入口,而不只换配置写法:

python -m pip install "pytest==9.1.1"

在独立目录的 pytest.ini 中暂时放入:

[pytest]
addopts = --strict-markers --strict-config

然后用一个未注册标记检查严格性:

import pytest

@pytest.mark.typo_marker
def test_probe():
    pass

执行 python -m pytest -q 应在收集时失败,而不是仅警告后通过。随后将标记移除,再独立加入一个不存在的 ini 选项,确认严格配置也会失败。两项分别检查,避免第一项错误提前终止,让另一项没有真正被验收。

回到业务配置时,移除故意制造的错误,再验证已注册标记和合法配置正常工作。多个配置文件、PYTEST_ADDOPTS、命令行 -o 以及编辑器入口,应检查实际加载的配置路径和参数来源,不能只看一份文件内容。

这与插件直接修改私有 config.inicfg 导致类型错误、或者自定义路径选项被参数解析器错误识别不同。修复的是合法兼容选项解析后的配置状态。它也不要求 pytest 递归展开任意层的自引用覆盖;需要复杂覆盖时,应简化来源并明确最终设置。