当前位置: 首页 > news >正文

pytest测试框架pytest-order插件自定义用例执行顺序

     pytest提供了丰富的插件来扩展其功能,本章介绍插件pytest-order,用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支,但是pytest-ordering已经不再维护了,建议大家直接使用pytest-order。

官方文档:
https://pytest-order.readthedocs.io/en/stable/usage.html

pytest-order官方显示的python和pytest版本限制:

  • pytest-order适用于 Python 3.7 - 3.12:
  • 对于 Python 3.9 之前的所有版本,pytest 版本 >= 5.0.0
  • 对于 Python >= 3.10,pytest >= 6.2.4。

默认情况下的执行顺序

文件间执行顺序

pytest会首先扫描当前目录及子目录下的所有文件,查找以test_开头(或包含_test)的文件以及测试模块(如test_*.py或*_test.py)。对于找到的测试文件,它们将按照文件名的ASCII码顺序执行,即数字、大写英文字母、小写英文字母的顺序。

文件内执行顺序

在每个测试文件中,pytest会按照测试用例(即测试函数或测试方法)定义的顺序执行。如果使用了类组织测试用例,那么类内部的测试用例将按照定义的顺序执行。

举例:测试文件中函数测试用例顺序是4,5,1,2,3,测试类中的测试用例顺序也是4,5,1,2,3。

测试用例执行后,按照4,5,1,2,3的顺序执行。

pytest-order安装

使用pip命令安装: pip install pytest-order (安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)

通过pycharm安装:打开设置,按照如下图中安装插件(windows系统)

pytest-order运行

使用@pytest.mark.order来装饰用例,然后执行命令中无需增加额外的运行参数,运行时会自动化识别自定义的顺序,并按照约定顺序执行。

1 使用数字定义顺序

使用正数或者负数定义顺序,数字越小先执行。举例@pytest.mark.order(1)或者@pytest.mark.order(index=1),可以直接填数字,也可以使用index=某个数字。

PS:该处的数字有点像python列表list的索引,0代表第一个元素,-1代表最后一个元素

  • 如果全是正数或者全是负数,按照数字小到大的顺序执行
  • 如果既有正数又有负数,则按照正数由小到大排序,然后再按照负数由小到大排序
  • 没有标记的测试用例在所有具有正数标记的测试之后执行,并在具有负数标记的测试之前执行。

举例:上面的用例重新定义顺序如下,既有正数也有负数排序

预期结果是先执行函数级用例并且执行顺序是1,2,3,4,5,再执行测试类中的用例并且执行顺序是5,4,3,2,1

用例执行后结果如下:符合预期

上面的测试用例如果全部换成使用@pytest.mark.order(index=1)这种格式定义,结果也是一样,此处不在赘述

2 使用英文代表的数字定义顺序

使用英文代表的数字定义顺序,数字越小先执行。

举例@pytest.mark.order("first")或者@pytest.mark.order(index="last")

first代表第1个(相当于数字0),last代表最后1个(相当于数字-1)

如果使用不在字典中的定义会告警,举例:定义@pytest.mark.order(index="ninth"),ninth表示第9个,执行后会告警,但是不影响使用

3 在测试类上做标记

如果order在测试类上设置标记,则该类中的所有测试将被视为具有相同的序数标记,例如,整个测试类会重新排序,而不会改变测试类内的测试顺序。

举例:标记以下类顺序。

预期结果是 先执行Testcase2的test_2_1,test_2_2,然后执行Testcase1的test_1_1,test_1_2

执行结果如下:符合预期

举例:同时标记类和类内的用例顺序,以用例标记为准

预期结果是 先执行Testcase1的test_1_2,test_1_1,然后执行Testcase2的test_2_2,test_2_1

执行后结果如下:符合预期

4 相对于其他测试用例的顺序

通过标记属性before和after引用其他测试用例的名称,before表示要在引用测试用例之前执行,after表示在引用测试用例之后执行。

引用的测试用例支持如下几种情况:

1)本文件内函数级用例引用其他函数级用例

预期结果是先执行test_3,然后test_2,最后test_1

执行后结果:符合预期

2)本文件内函数级用例引用其他测试类中的用例

预期结果是先执行test_3,然后Testcse1.test_1_1,Testcse1.test_1_2,最后是test_1

执行结果如下:符合预期

3)本文件内用例引用其他文件中的用例

举例: 在同一个目录有两个测试文件test_case1.py和test_case2.py,其中test_case1.py文件中的用例通过before和after引用了test_case2.py文件中的test_1用例,

当执行这个目录的用例时,预期结果是:先执行test_case1.py.test_2,然后是test_case2.py.test_1,然后是test_case1.py.test_1,最后是test_case2.py.test_2

执行后结果: 符合预期

4)在测试类上标记其他测试类

使用before或 after标记属性来引用测试类,标记类中的测试将排在引用类中的所有测试前面或者后面。

举例:标记Testcase1类在Testcase2之后运行,并且设置Testcase2中先运行test_2_2

执行后结果:符合预期

5 绝对排序和相对排序的组合

如果将绝对顺序标记和相对顺序标记组合在一起,则首先对绝对标记(例如序数)进行排序,然后再对相对标记(before或者after)进行排序,这意味着相对顺序始终优先。

举例:设置如下两条用例,test_1_1用例标记index=1和after=’tet_1_2’,虽然设置test_1_2顺序为0,但按照相对顺序优先的原则,预期先执行test_1_2,然后再执行test_1_1。

执行结果如下:符合预期

6 同一标记的几种关系

如果需要相对于多个其他测试用例的顺序对某个测试用例进行排序,则可以使用测试名称列表或元组将多个测试名称添加到before或after参数中。

举例:设置如下4条用例,测试类Testcase.test_1_1用例标记在Testcase1.test_1_2和Testcase2.test_2_2之后执行。同时标记Testcase2.test_2_1和Testcase2.test_2_2的顺序。

如果Testcase.test_1_1不做标记,执行顺序为Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_1 > Testcase1.test_1_2

但是标记之后,预期执行顺序是Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_2 > Testcase1.test_1_1

执行后结果: 符合预期

7 与参数化测试的关系

1)引用被参数化的测试用例,只能使用测试名称,而不能引用某个参数。

举例:设置2条用例,test_2用例设置3个参数,而test_1标记after=’test_2’,只能标记测试用例名称。

预期是先执行3条test_2,然后再执行test_1

执行结果:符合预期

2) 在参数化用例上设置顺序标记

举例:设置2条用例,test_2用例设置3个参数并标记顺序为0

预期是先执行3条test_2,然后再执行test_1

执行结果:符合预期

8 用例上设置多个顺序标记

可以为测试设置多个顺序标记,在这种情况下,测试将按照定义的顺序执行多次。

举例:设置2条用例,test_1用例标记顺序0和1,test_2用例设置3个参数,标记两个顺序1和3,

预期是先执行 test_1,然后再执行3条test_2,再执行test_1,最后执行3条test_2

执行结果:符合预期

      以上就是介绍的插件pytest-order的功能,但实际在编写测试用例时还是要尽量避免存在过多的用例的顺序依赖,如果有依赖可以参考之前文章介绍尽量使用setup或者teardown功能,总之我们要考虑尽可能减少后期维护用例的工作量。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

---祝愿大家都能够龙腾虎跃,步步高升!!!

相关文章:

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能,本章介绍插件pytest-order,用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支,但是pytest-ordering已经不再维护了,建议大家直接使用pytest-order。 官方文…...

吴恩达机器学习 第三课 week2 推荐算法(上)

目录 01 学习目标 02 推荐算法 2.1 定义 2.2 应用 2.3 算法 03 协同过滤推荐算法 04 电影推荐系统 4.1 问题描述 4.2 算法实现 05 总结 01 学习目标 (1)了解推荐算法 (2)掌握协同过滤推荐算法(Collabo…...

MySQL CASE 表达式

MySQL CASE表达式 一、CASE表达式的语法二、 常用场景1,按属性分组统计2,多条件统计3,按条件UPDATE4, 在CASE表达式中使用聚合函数 三、CASE表达式出现的位置 一、CASE表达式的语法 -- 简单CASE表达式 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女…...

Unity3D 游戏数据本地化存储与管理详解

在Unity3D游戏开发中,数据的本地化存储与管理是一个重要的环节。这不仅涉及到游戏状态、玩家信息、游戏设置等关键数据的保存,还关系到游戏的稳定性和用户体验。本文将详细介绍Unity3D中游戏数据的本地化存储与管理的技术方法,并给出相应的代…...

昇思25天学习打卡营第1天|初学教程

文章目录 背景创建环境熟悉环境打卡记录学习总结展望未来 背景 参加了昇思的25天学习记录,这里给自己记录一下所学内容笔记。 创建环境 首先在平台注册账号,然后登录,按下图操作,创建环境即可 创建好环境后进入即可&#xff0…...

ctfshow-web入门-命令执行(web59-web65)

目录 1、web59 2、web60 3、web61 4、web62 5、web63 6、web64 7、web65 都是使用 highlight_file 或者 show_source 1、web59 直接用上一题的 payload: cshow_source(flag.php); 拿到 flag:ctfshow{9e058a62-f37d-425e-9696-43387b0b3629} 2、w…...

Websocket在Java中的实践——最小可行案例

大纲 最小可行案例依赖开启Websocket,绑定路由逻辑类 测试参考资料 WebSocket是一种先进的网络通信协议,它允许在单个TCP连接上进行全双工通信,即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455,并且已被W3C定义为…...

python请求报错::requests.exceptions.ProxyError: HTTPSConnectionPool

在发送网页请求时,发现很久未响应,最后报错: requests.exceptions.ProxyError: HTTPSConnectionPool(hostsvr-6-9009.share.51env.net, port443): Max retries exceeded with url: /prod-api/getInfo (Caused by ProxyError(Unable to conne…...

【Unity】Excel配置工具

1、功能介绍 通过Excel表配置表数据,一键生成对应Excel配置表的数据结构类、数据容器类、已经二进制数据文件,加载二进制数据文件获取所有表数据 需要使用Excel读取的dll包 2、关键代码 2.1 ExcelTool类 实现一键生成Excel配置表的数据结构类、数据…...

001 线性查找(lua)

文章目录 迭代器主程序 迭代器 -- 定义一个名为 linearSearch 的函数,它接受两个参数:data(一个数组)和 target(一个目标值) function linearSearch(data, target) -- 使用 for 循环遍历数组 data&…...

数据结构之链表

储备知识: 线性表 :一对一的数据所组成的关系称为线性表。 线性表是一种数据内部的逻辑关系,与存储形式无关线性表既可以采用连续的顺序存储(数组),也可以采用离散的链式存储(链表)顺序表和链表都称为线性表 顺序存储就是将数据存…...

【小工具】 Unity相机宽度适配

相机默认是根据高度适配的,但是在部分游戏中需要根据宽度进行适配 实现步骤 定义标准屏幕宽、高判断标准屏幕宽高比与当前的是否相等通过**(标准宽度/当前宽度) (标准高度 / 当前高度)**计算缩放调整相机fieldOfView即…...

centos误删yum和python

在下载pkdg时,因为yum报错坏的解释器,然后误删了yum和python。 在下载各种版本,创建各种软连接,修改yum文件都不好使后,发现了这样一个方法:Centos: 完美解决python升级导致的yum报错问题(相信…...

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级!首推专题区(推荐分类)更多自定义颜色!选择自己喜欢的色系,焕然一新的UI设计,更加扁平和现代化! WP黑格导航主题BlackCandy...

elasticsearch底层核心组件

Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它基于Apache Lucene构建,并添加了分布式特性。以下是Elasticsearch的一些底层核心组件: 1. **Lucene**: - Elasticsearch基于Apache Lucene,一个高性能的…...

EasyExcel数据导入

前言: 我先讲一种网上信息的获取方式把,虽然我感觉和后面的EasyExcel没有什么关系,可能是因为这个项目这个操作很难实现,不过也可以在此记录一下,如果需要再拆出来也行。 看上了网页信息,怎么抓到&#x…...

20240630 每日AI必读资讯

📚全美TOP 5机器学习博士发帖吐槽:实验室H100数量为0! - 普林斯顿、哈佛「GPU豪门」,手上的H100至少三四百块,然而绝大多数ML博士一块H100都用不上 - 年轻的研究者们纷纷自曝自己所在学校或公司的GPU情况&#xff1a…...

第十一章 Qt的模型视图

目录 一、模型/视图的原理 1、原理分析 2、模型(数据模型) 3、视图 4、代理 二、文件系统模型 1、项目练习 2、UI 设计 3、代码实现 三、字符串链表模型 QStringListModel 1、项目效果 2、项目实现 四、标准项模型(QStandardItemModel) 1、模型分析 2、项目效…...

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系,按照题意,双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格,因此需要转换成字符数组进行更方便的操作,将字符串s拆分成单词列表…...

10款好用不火的PC软件,真的超好用!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/市场上有很多软件,除了那些常见的大众化软件,还有很多不为人知的小众软件,它们的作用非常强大,简洁…...

3步解锁12种加密音乐:免费开源工具让数字音乐重获自由

3步解锁12种加密音乐:免费开源工具让数字音乐重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https…...

百度网盘Mac版SVIP破解终极指南:解锁70倍下载速度的完整方案

百度网盘Mac版SVIP破解终极指南:解锁70倍下载速度的完整方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 百度网盘Mac版SVIP破解插件是一…...

RISC-V开发踩坑实录:从编译错误‘csrr a5,mhartid’到GDB报错‘E14’的完整排错指南

RISC-V开发实战:从编译到调试的完整排错手册 在嵌入式开发领域,RISC-V架构正以惊人的速度改变着行业格局。作为一名长期从事ARM架构开发的工程师,当我第一次接触RISC-V时,本以为凭借多年的嵌入式经验可以轻松上手,却没…...

从PAM到BanditPAM:k-Medoids聚类算法的演进、优化与实战选型指南

1. 为什么需要k-Medoids算法? k-Means算法大家应该都不陌生,它简单高效,是很多数据科学项目的入门首选。但我在实际项目中经常遇到这样的情况:当数据集中存在异常值或噪声点时,k-Means的表现就会大打折扣。这是因为k-M…...

别再只会用digitalWrite了!用Arduino UNO的PWM引脚玩转RGB呼吸灯(附完整代码)

Arduino PWM实战:从呼吸灯到RGB色彩控制的深度探索 引言:为什么我们需要PWM? 想象一下,你第一次接触Arduino时,可能从最简单的Blink程序开始——让LED灯以固定频率闪烁。这种简单的开关控制能满足基础需求,…...

ElevenLabs免费额度使用全攻略(2024年Q2实测版):从注册到语音生成的7个生死节点

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs免费额度的核心机制与边界认知 ElevenLabs 的免费层并非基于“每月固定时长”,而是采用动态配额(Dynamic Quota)模型,其核心由三重维度共同约束…...

终极指南:如何用免费软件完全掌控Windows电脑风扇噪音与散热平衡

终极指南:如何用免费软件完全掌控Windows电脑风扇噪音与散热平衡 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_T…...

自托管OSINT平台Sovereign Shield:构建数据主权的容器化情报系统

1. 项目概述:一个面向开源情报与数字资产保护的“主权之盾” 在开源情报(OSINT)和数字资产安全领域,从业者常常面临一个核心矛盾:一方面,我们需要强大的自动化工具来高效地收集、分析和监控公开信息&#x…...

桌面端酷安社区体验:Coolapk UWP 完整使用指南

桌面端酷安社区体验:Coolapk UWP 完整使用指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 你是否曾经希望在电脑大屏幕上舒适地浏览酷安社区,摆脱手机小屏幕的…...

别再折腾了!我整理好的Elsevier LaTeX模板(通用版+复杂版)直接拿来用

Elsevier LaTeX模板终极避坑指南:从编译报错到一键投稿 第一次打开Elsevier官方LaTeX模板时,我盯着满屏的报错信息足足愣了五分钟——作为一个刚踏入科研领域的研究生,这简直像在解一道没有提示的数学证明题。经过三个月的反复试错和数十次期…...