Pytest 测试用例执行顺序自定义
pytest-order
接下来我们来学习 pytest 中如何自己指定测试用例的执行顺序。
简介
pytest-order 是一个 Pytest 插件,可自定义 Pytest 测试用例的执行顺序。
这对于确保特定测试用例在其他测试用例之前或之后运行非常有用。

pytest-order 可以帮助我们自定义测试用例执行顺序。默认情况下,pytest 会按照测试代码从上到下执行。但在一些集成测试或者业务流程测试中,经常会存在前后依赖关系。例如:必须先注册账号、再登录系统、最后修改个人信息。这时候就可以使用 pytest-order 来控制执行顺序。这里大家一定要注意一个问题。理论上来说:自动化测试最好是“完全独立”的。也就是说:任何一条测试,都不应该依赖其他测试。但现实企业项目里,其实很难完全做到。尤其是:集成测试、业务流程测试、接口链路测试。这些场景里,经常会有上下文依赖。比如:订单测试必须依赖登录。支付测试必须依赖创建订单。所以很多企业项目,还是会使用执行顺序控制。这也是 pytest-order 存在的重要原因。
使用场景
对于集成测试,经常会有上下文依赖关系的测试用例。这些步骤往往需要按顺序执行。
- 登录
- 创建订单
- 支付订单
- 查询订单
对于集成测试,经常会有上下文依赖关系的测试用例。比如登录、创建订单、支付订单、查询订单。这些步骤往往需要按顺序执行。虽然可以通过 setup、teardown、fixture 解决部分问题。但很多时候,直接控制执行顺序会更加直观。这里给大家举个真实企业里的例子。比如我们测试一个电商系统。可能会有下面几个测试:第一步:用户登录。第二步:创建订单。第三步:支付订单。第四步:查询订单状态。第五步:取消订单。大家会发现:后面的步骤,其实依赖前面的步骤。如果你先执行“支付订单”,那肯定失败。因为订单都还没创建。所以这种业务流程型测试,经常需要指定执行顺序。当然,很多同学会问:那为什么不用 fixture?其实 fixture 也能解决部分问题。但:fixture 更适合公共初始化。而 pytest-order 更适合:“明确控制测试先后顺序”。所以企业项目里,这两种方式经常会结合使用。
安装插件
pytest-order 是目前社区主流推荐的执行顺序插件。
pip install pytest-order
这里我们先安装一下插件。新版插件名字叫:pytest-order。安装命令非常简单。直接:pip install pytest-order。这里大家一定注意。不要安装旧版:pytest-ordering。因为那个插件已经很多年没人维护了。新版 pytest 兼容性也不太好。现在企业项目基本都已经切换到 pytest-order。
基本使用
-
指定执行顺序:
-
order 值越小
- 优先级越高
- 越先执行
import pytest
@pytest.mark.order(2)
def test_b():
print("test_b")
@pytest.mark.order(1)
def test_a():
print("test_a")
下面我们来看一下最基本的使用方式。大家会发现:新版写法非常简单。@pytest.mark.order(1) 就可以指定执行顺序。这里 order 数字越小。执行优先级越高。比如:order(1) 先执行、order(2) 后执行。这个是现在企业里的主流写法。
示例代码
-
执行顺序:
-
test_login
- test_create_order
- test_pay
import pytest
@pytest.mark.order(3)
def test_pay():
print("支付订单")
assert True
@pytest.mark.order(1)
def test_login():
print("用户登录")
assert True
@pytest.mark.order(2)
def test_create_order():
print("创建订单")
assert True
这里我们来看一个更接近真实业务的例子。大家可以看到:这里有三个测试。第一个:登录。第二个:创建订单。第三个:支付订单。如果不指定顺序。pytest 默认会按照代码顺序执行。但现在我们使用:@pytest.mark.order() 来指定顺序。于是:登录会先执行。创建订单第二执行。支付最后执行。这就更符合真实业务流程了。企业项目里,这种写法是非常常见的。
默认执行顺序
在未使用 pytest-order 时:
pytest 默认按照代码从上到下执行。

这里大家要理解 pytest 默认执行机制。默认情况下:pytest 会按照代码顺序执行。也就是:从上到下。谁写前面谁先执行。但问题就在于:很多时候代码顺序并不等于业务顺序。尤其多人协作开发时:测试文件可能会不断调整。所以如果业务依赖执行顺序。最好明确指定 order。
指定 first 和 last
除了数字顺序。还支持 first 和 last。
@pytest.mark.order("first")
def test_login():
pass
@pytest.mark.order("last")
def test_logout():
pass
def test_create_order():
pass
除了数字之外。pytest-order 还支持:first 和 last。这个在企业项目里也很常见。比如:登录一定最先执行。退出登录一定最后执行。这时候:直接使用: @pytest.mark.order("first") 或者:@pytest.mark.order("last") 会更直观。可读性也更强。
运行演示
pytest -vs
执行结果:
test_login PASSED
test_create_order PASSED
test_pay PASSED
下面我们来运行一下。执行命令:pytest -vs 最终执行顺序并不是代码顺序。而是order 顺序。这就是 pytest-order 的核心作用。很多企业接口自动化项目里:都会大量使用这种方式来控制业务流程测试。
注意事项
- 不建议大量依赖执行顺序
- 自动化测试尽量保持独立
- order 更适合集成测试
- 不适合完全独立的单元测试
pytest-order 虽然很好用。但也不能滥用。这里给大家一个非常重要的企业经验。虽然 pytest-order 很方便。但:不要过度依赖执行顺序。因为:一旦测试之间耦合太严重。后期维护会非常痛苦。理想情况下:测试应该尽量独立。所以:pytest-order 更适合:集成测试、业务流程测试、链路测试。而不是:完全独立的单元测试。这个大家一定要区分清楚。
总结
- pytest-order 用于控制测试执行顺序
- 使用方式:
@pytest.mark.order(1) - order 值越小越先执行
- 更适合集成测试场景
好了,关于 pytest-order 插件我们先介绍到这里。最后我们来总结一下。大家重点需要记住几个内容。第一:pytest-order 是现在主流的执行顺序插件。第二:旧版 pytest-ordering 已经过时。第三:新版写法是:@pytest.mark.order(1)。第四:它非常适合集成测试和业务流程测试。好了,关于 pytest-order 的内容,我们先介绍到这里。