14:pytest-order 插件 顺序控制案例

在 pytest 默认执行规则中,测试用例是按照文件加载顺序、字母顺序 自动执行的,无法人为指定先后。但在实际 GUI 自动化、接口自动化项目中,用例往往存在依赖关系(比如必须先执行登录,才能执行下单;必须先执行新增,才能执行编辑 / 删除),强行依赖默认顺序极易导致用例执行失败。

针对这个问题,pytest-order 第三方插件是官方推荐、最稳定的解决方案,它可以轻松指定用例的执行顺序,支持函数、类、模块多级控制,简单易用、兼容性极强。

本文基于你提供的核心内容,从安装、基础用法、高级用法到实战场景,完整讲解 pytest 用例执行顺序控制。


一、为什么需要指定用例执行顺序?

pytest 默认执行顺序规则:

  1. 先按测试文件的字母顺序排序
  2. 文件内按测试函数 / 方法的字母顺序排序
  3. 不保证依赖用例的执行顺序

真实痛点

  • 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

执行顺序

  1. TestLogin 类下所有用例
  2. 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 核心规则总结

  1. 数字越小,执行越早:order(1) > order(2)
  2. 正数优先执行,未标记用例在中间执行
  3. 负数最后执行:order(-1) 最后一个,order(-2) 倒数第二个
  4. 支持函数、类、模块三级顺序控制
  5. 与 pytest 原生功能、fixture、parametrize 完全兼容

八、总结

pytest-order 是 pytest 生态中控制用例执行顺序最标准、最稳定的插件,是自动化测试项目必备工具。

核心知识点:

  1. 安装命令:pip install pytest-order==1.3.0
  2. 基础标记:@pytest.mark.order(数字)
  3. 正整数:优先执行,数字越小越早
  4. 负整数:最后执行,数字越小越晚
  5. 支持函数、测试类多级控制
  6. 完美适配 GUI 自动化、接口自动化的依赖场景

学会用例顺序控制,你的自动化用例执行稳定性会大幅提升,彻底避免 "因顺序错误导致的用例失败"!

相关推荐
郝学胜-神的一滴3 小时前
Qt 高级开发 009: C++ Lambda 表达式
开发语言·c++·qt·软件构建
测试开发-学习笔记3 小时前
从0开始搭建自动化(一)-appium+python
python·自动化
㳺三才人子3 小时前
初探 Flask
后端·python·flask·html
星栈独行3 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
石山代码4 小时前
C++ 轻量级日志系统
开发语言·c++
AI算法沐枫4 小时前
机器学习到底是什么?
人工智能·python·深度学习·机器学习·数据挖掘·大模型·#ai
小技与小术4 小时前
玩转Flask
开发语言·python·flask
SilentSamsara4 小时前
Python 性能优化:tracemalloc、profiling 与 C 扩展加速
开发语言·python·青少年编程·性能优化
冰小忆5 小时前
大驼峰命名规范和小驼峰命名规范的区别是什么?
开发语言·python