pytest-ordering 不能真正控制全局执行顺序,因为它仅对同一模块内用例按 order 值局部重排,不改变文件加载顺序、fixture 执行序或跨文件用例顺序。

pytest-ordering 为什么不能真正“控制顺序”?
它只是在 pytest 收集用例后、运行前,对 test_* 函数按装饰器标记做局部重排,不改变 pytest 原生的收集逻辑(比如按文件/行号顺序),也不影响 fixture 执行顺序或跨文件用例排序。如果你依赖严格全局序(如 test_a → test_b → test_c),pytest-ordering 无法保证——尤其当用例分散在多个文件时,文件加载顺序本身就不稳定。
@pytest.mark.run(order=...) 的实际行为和限制
这个装饰器只对同一模块内、被 pytest 同一批次收集的用例生效。order 值越小越先执行,相同 order 值则回退到默认顺序(通常是定义顺序)。
- 负数 order 是允许的,比如
@pytest.mark.run(order=-1)可用于“最先执行” - order 值不必连续,
order=1和order=100之间可以跳过任意整数 - 如果两个用例都未标 order,默认 order=0;若一个标了
order=5,另一个没标,后者仍按 0 处理,所以会先执行 - 跨文件无效:file1.py 中
@pytest.mark.run(order=1)和 file2.py 中@pytest.mark.run(order=2)不保证先后——pytest 先加载哪个文件,哪个文件里的用例就先跑
如何避免 order 冲突和意外跳过
常见错误是多个用例用了相同 order 值,又没注意定义顺序,导致执行顺序不可预测;或者误以为加了 @pytest.mark.run 就能跨文件调度。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 始终显式标注所有需要排序的用例,避免混用“标了 order”和“没标”的情况
- 用
pytest --collect-only查看实际收集顺序,确认 order 是否生效(输出中会显示run(order=...)标记) - 不要依赖 order=0:显式写
@pytest.mark.run(order=0)比不写更安全,否则可能被其他未标记用例挤到中间 - 如果必须跨文件控制,改用
pytest-dependency或重构为单个测试类 +pytest-xdist禁用并行,再靠类内方法顺序硬控
替代方案比 order 更可靠的地方
真要强制串行且有序,不如放弃 pytest-ordering,改用更底层可控的方式:
- 把一组强依赖的用例写进同一个
class TestFlow:里,靠方法名(如test_01_login,test_02_upload)和 pytest 默认的字母序执行 - 用
pytest -k "test_01 or test_02"手动指定执行列表,顺序由 shell 命令决定 - 在
conftest.py里 hookpytest_collection_modifyitems,按自定义规则重排items列表——这是唯一能真正干预跨文件顺序的方法,但需自己维护排序逻辑
order 标记看着简单,实际容易漏掉文件粒度的不确定性。真正关键的顺序依赖,得从测试设计层面收敛到单个作用域里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










