在 pytest 默认执行规则中,测试用例是按照文件加载顺序、字母顺序 自动执行的,无法人为指定先后。但在实际 GUI 自动化、接口自动化项目中,用例往往存在依赖关系(比如必须先执行登录,才能执行下单;必须先执行新增,才能执行编辑 / 删除),强行依赖默认顺序极易导致用例执行失败。
针对这个问题,pytest-order 第三方插件是官方推荐、最稳定的解决方案,它可以轻松指定用例的执行顺序,支持函数、类、模块多级控制,简单易用、兼容性极强。
本文基于你提供的核心内容,从安装、基础用法、高级用法到实战场景,完整讲解 pytest 用例执行顺序控制。
一、为什么需要指定用例执行顺序?
pytest 默认执行顺序规则:
- 先按测试文件的字母顺序排序
- 文件内按测试函数 / 方法的字母顺序排序
- 不保证依赖用例的执行顺序
真实痛点:
- GUI 自动化:登录 → 进入首页 → 打开菜单 → 编辑信息,必须按顺序执行
- 接口自动化:新增 → 查询 → 修改 → 删除,顺序不能乱
- 冒烟测试:优先执行核心主流程用例
pytest-order 就是专门解决这类问题的神器。
二、插件安装
指定版本安装,避免兼容性问题:
pip install pytest-order==1.3.0
安装完成后,直接使用 @pytest.mark.order() 装饰器即可生效,无需其他配置。
三、基础用法:指定测试函数执行顺序
这是最常用、最简单的方式,直接在测试函数上方添加装饰器,数字越小,执行越早。
示例代码(你的核心示例)
python
import pytest
# 标记第一个执行
@pytest.mark.order(1)
def test_one():
assert True
# 标记第二个执行
@pytest.mark.order(2)
def test_two():
assert True
执行结果
collected 2 items
cases/test_order.py::test_one PASSED
cases/test_order.py::test_two PASSED
规则说明
order(数字):数字为正整数,越小执行越早- 未加标记的用例:默认在所有加标记的用例之后执行
- 数字可以不连续(如 1、3、5),依然按从小到大执行
四、进阶用法:在测试类上使用顺序控制
pytest-order 不仅可以用于测试函数 ,还可以直接用于测试类,实现整个类的统一排序,类内部用例仍按默认顺序执行。
示例:类级别排序
python
import pytest
# 整个类第一个执行
@pytest.mark.order(1)
class TestLogin:
def test_login_by_password(self):
assert True
def test_login_by_sms(self):
assert True
# 整个类第二个执行
@pytest.mark.order(2)
class TestOrder:
def test_create_order(self):
assert True
执行顺序
- TestLogin 类下所有用例
- TestOrder 类下所有用例
适用场景:按业务模块划分执行顺序(登录模块 → 订单模块 → 用户模块)。
五、高级用法:负数序号(后置用例)
除了正整数,pytest-order 支持负数序号 ,代表最后执行,数字越小(越负),执行越晚。
常用场景:清理数据、退出登录、关闭驱动等后置操作。
python
import pytest
# 第一个执行
@pytest.mark.order(1)
def test_login():
assert True
# 最后一个执行
@pytest.mark.order(-1)
def test_logout():
assert True
# 倒数第二个执行
@pytest.mark.order(-2)
def test_clear_data():
assert True
六、实战场景:GUI 自动化顺序控制
结合GUI 自动化,可直接套用的实战示例:
python
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
# 1. 最先执行:打开页面
@pytest.mark.order(1)
def test_open_page(driver):
driver.get("http://demo.com/login")
assert "登录" in driver.title
# 2. 第二个执行:输入账号密码
@pytest.mark.order(2)
def test_input_info(driver):
driver.find_element(By.ID, "username").send_keys("admin")
driver.find_element(By.ID, "password").send_keys("123456")
# 3. 第三个执行:点击登录
@pytest.mark.order(3)
def test_click_login(driver):
driver.find_element(By.ID, "loginBtn").click()
# 4. 最后执行:退出登录
@pytest.mark.order(-1)
def test_logout(driver):
driver.find_element(By.ID, "logoutBtn").click()
执行顺序严格按照: 打开页面 → 输入信息 → 点击登录 → 退出登录
完美解决 GUI 自动化用例依赖问题!
七、pytest-order 核心规则总结
- 数字越小,执行越早:order(1) > order(2)
- 正数优先执行,未标记用例在中间执行
- 负数最后执行:order(-1) 最后一个,order(-2) 倒数第二个
- 支持函数、类、模块三级顺序控制
- 与 pytest 原生功能、fixture、parametrize 完全兼容
八、总结
pytest-order 是 pytest 生态中控制用例执行顺序最标准、最稳定的插件,是自动化测试项目必备工具。
核心知识点:
- 安装命令:
pip install pytest-order==1.3.0 - 基础标记:
@pytest.mark.order(数字) - 正整数:优先执行,数字越小越早
- 负整数:最后执行,数字越小越晚
- 支持函数、测试类多级控制
- 完美适配 GUI 自动化、接口自动化的依赖场景
学会用例顺序控制,你的自动化用例执行稳定性会大幅提升,彻底避免 "因顺序错误导致的用例失败"!