pytest 文件参数换个顺序,子目录 fixture 就找不到了
9.1.1 混合父目录文件与子目录文件参数时,收集节点差异可能影响 fixture 可见性。保留同一清单,先调整顺序或明确目录收集范围。
子目录里的 conftest.py 定义了 fixture,测试单独跑能找到,把几个文件交错列在命令行后却报 fixture 'widget' not found。如果 pytest 是 9.1.1,且参数混合了父目录文件和子目录文件,应先比较收集入口与文件顺序。
明确的环境包括 Windows 11、CPython 3.12、pytest 9.1.1。fixture 本身没有改名;同一份文件清单,只把父目录文件放到前面,或者改为从共同目录收集,就可能恢复可见性。
保留同一份测试清单,先调整收集方式
假设布局是:
tests/
conftest.py
test_top.py
pkg/
conftest.py
test_a.py
test_b.py
pkg/conftest.py 定义 widget,两个子目录测试都请求它。相关失败顺序是:
python -m pytest tests/pkg/test_a.py tests/test_top.py tests/pkg/test_b.py
可改为父目录文件在前:
python -m pytest tests/test_top.py tests/pkg/test_a.py tests/pkg/test_b.py
如果本来就要跑整个 tests,可直接使用 python -m pytest tests/。这会按目录发现测试,可能包含原文件清单之外的测试,不能未经核对就替换 CI 中有意选择的一小组用例。
pytest 9.1.1 会把部分 fixture 绑定到具体收集节点,并检查该节点是不是请求方的祖先。交错文件参数引发的收集节点差异,可能让路径看似相同的子目录配置无法匹配。改写顺序处理的是这条收集路径,不是在扩大 fixture 的作用域。
找不到 fixture 不只有这一种原因
先确认原错误随文件顺序改变而改变,再采用此处理。参数拼错、fixture 插件未加载、测试不在 conftest 的可发现范围内,也会出现相同文本。不要把 conftest 里的所有 fixture 都复制到根目录,那会改变覆盖关系和清理责任。
自定义文件路径选项无法识别发生在较早的初始配置发现阶段;本题参数已经解析,错误出现在测试请求 fixture。给所有参数增加等号不能替代文件收集顺序的核对。
修改前保留 CI 的原始文件清单和启动目录。用相同清单复查收集数量与每个 nodeid,再正常执行原测试组,确认子目录 fixture 生效、没有遗漏测试。需要恢复原入口时,一起恢复文件选择规则;若正式版本尚未覆盖这条路径,不应撤去顺序处理后只看一个独立文件通过。


