为何py.test反向运行模块doctest?如何调整测试执行顺序?
控制pytest模块内测试执行顺序的几种方法
我完全懂你的困扰——明明anti_add依赖add的正常功能,结果它先跑失败了,反而add的问题没先暴露出来,排查的时候特别容易懵。这是因为pytest默认是按模块和测试函数名的字母顺序执行的,刚好你的anti_add在字母排序上比add靠前,所以才出现了这个反直觉的情况。下面给你几个实用的解决办法:
方法1:使用pytest-ordering插件(最简单直接)
这个插件专门用来指定测试执行顺序,步骤非常简单:
- 先安装插件:
pip install pytest-ordering
- 在测试函数上加标记,明确指定执行顺序:
# 你的测试文件(first_module.py/second_module.py) import pytest @pytest.mark.run(order=1) def test_add(): # 你的测试逻辑 assert add(2,3) == 5 @pytest.mark.run(order=2) def test_anti_add(): # 依赖test_add的测试逻辑 assert anti_add(5,3) == 2
这样不管函数名的字母顺序如何,test_add都会优先执行,完全符合你的预期。
方法2:使用pytest内置的dependency标记(更贴合依赖关系)
如果你的场景是“anti_add必须在add执行之后,且只有add成功了才有必要跑anti_add”,那用内置的dependency标记会更合理:
- 无需额外安装插件,直接在代码中使用:
import pytest @pytest.mark.dependency(name="add_test") def test_add(): assert add(2,3) == 5 @pytest.mark.dependency(depends=["add_test"]) def test_anti_add(): assert anti_add(5,3) == 2
这种情况下,pytest会先执行test_add;如果test_add失败,test_anti_add会被自动标记为skipped(跳过),不会再执行。这样你能一眼就看出是add的问题导致后续测试无法正常运行,逻辑更清晰。
方法3:通过函数命名强制排序(最原始的无插件方式)
如果你不想依赖任何插件,也可以直接给测试函数按顺序命名:
def test_01_add(): assert add(2,3) == 5 def test_02_anti_add(): assert anti_add(5,3) == 2
因为pytest默认按字母顺序排序,test_01_add会比test_02_anti_add先执行。不过这种方式灵活性较差,后续调整顺序需要修改函数名,适合简单场景使用。
小技巧
如果你想直观查看pytest的执行顺序,可以加上--verbose参数运行,这样能清晰看到每个测试的执行顺序:
py.test --verbose
内容的提问来源于stack exchange,提问作者iago-lito
相关产品推荐
相关产品推荐

