You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何py.test反向运行模块doctest?如何调整测试执行顺序?

控制pytest模块内测试执行顺序的几种方法

我完全懂你的困扰——明明anti_add依赖add的正常功能,结果它先跑失败了,反而add的问题没先暴露出来,排查的时候特别容易懵。这是因为pytest默认是按模块和测试函数名的字母顺序执行的,刚好你的anti_add在字母排序上比add靠前,所以才出现了这个反直觉的情况。下面给你几个实用的解决办法:

方法1:使用pytest-ordering插件(最简单直接)

这个插件专门用来指定测试执行顺序,步骤非常简单:

  1. 先安装插件:
pip install pytest-ordering
  1. 在测试函数上加标记,明确指定执行顺序:
# 你的测试文件(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标记会更合理:

  1. 无需额外安装插件,直接在代码中使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:12:37