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功能,总之我们要考虑尽可能减少后期维护用例的工作量。

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展,越来越多的企业开始寻求在国际市场上扩展业务,这一趋势被称为企业出海。然而,企业在海外扩张面临诸多隐患与安全挑战,其中因为地域的不同,在安全性方面与国内相比会变得薄弱,从而导致被黑…

如何在浏览器中查看网页的HTML源代码?

如何在浏览器中查看网页的HTML源代码? 浏览html网页,查看其源代码,可以帮助我们了解该版网页的信息以及架构,每个浏览器都是允许用户查看他们访问的任何网页的HTML源代码的。以下编程狮小师妹就介绍几个常见浏览器的查看网页 HTM…

mysql安装创建数据库防止踩坑

为了安装MySQL的家人们走弯路,稍微有些啰嗦,讲述我安装的时遇到的问题,如何解决。仔细看看离成功不远。 mysql下载链接 MySQL :: Download MySQL Community Server windows下安装mysql-8.0.29-winx64,下载安装包后解压到文件夹中…

C语言 | Leetcode C语言题解之第191题位1的个数

题目: 题解: int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

Windows安装jdk配置环境变量(基础)

一、下载安装JDK 下载地址:https://www.oracle.com/java/technologies/downloads/?er221886#java8-windows 因为JDK8比较稳定,所以建议选择这个。电脑32位的下载jdk-8u411-windows-i586.exe;电脑是64位的下载jdk-8u411-windows-x64.exe 1、…

链动2+1模型:驱动用户增长与业务提升的新引擎

大家好,我是吴军,来自一家业界领先的科技创新公司。在今天,我想与大家分享一个在我们业务中取得显著成果的运营策略——链动21模型,以及它是如何助力我们优化用户满意度,提高用户粘性和促进复购率的。 尽管链动模式在业…

安装Flask

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多数Python包都使用pip实用工具安装,使用Virtualenv创建虚拟环境时会自动安装pip。激活虚拟环境后,pip 所在的路径会被添加…

计算机组成原理——系统总线

题目:计算机使用总线结构便于增减外设,同时__C____。 A.减少了信息传送量 B.提高了信息传输速度 C.减少了信息传输线的条数 1. 总线的分类 1.1. 片内总线 芯片内部的总线 在CPU芯片内部,寄存器与寄存器之间、寄存器与逻辑单元ALU之间 1.1.1. 数据总线 双向传输总线 数…

麒麟系统安装Redis

一、背景 如前文(《麒麟系统安装MySQL》)所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件,须下载源码编译。 下载地址:https://redis.io/downloads 6.2.14版本源码下载地址:https://download.redis.io/re…

生成随机函数f3,利用f3生成f18(python)

一、题目 给定一个完全随机函数f3。能够完全随机产生1~3之间任意一个自然数。现在要构造一个f18,让其能随机产生1~18之间任意一个自然数,要求写出f18的函数,另外要测试是否符合预期,f18要用f3 二、代码 欢迎大家给我更优解&…

mac 安装mysql启动报错 ERROR!The server quit without update PID file

发现问题: mac安装mysql初次启动报错: 一般出现这种问题,大多是文件夹权限,或者以前安装mysql卸载不干净导致。首先需要先确定问题出在哪?根据提示我们可以打开mysql的启动目录,查看启动日志。 问题解决&a…

项目如何整合sentinel

1、添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifact…

2.x86游戏实战-跨进程读取血量

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 接下来会写C/C代码&#xff0c;C/C代码不是很难&#xff0c;然后为了快速掌握逆向这个技能&#xff0c;我…

不用再找了,这是大模型实践最全的总结

随着ChatGPT的迅速出圈&#xff0c;加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说&#xff0c;传统的单机单卡训练模式肯定不能满足上千&#xff08;万&#xff09;亿级参数的模型训练&#xff0c;这时候我们就需要解决内存墙和通信墙等一系列问题&am…

flask-socket的实践

1.长连接和短连接的由来 1&#xff09;TCP在真正的读写操作之前&#xff0c;server与client之间必须建立一个连接&#xff0c; 当读写操作完成后&#xff0c;双方不再需要这个连接时它们可以释放这个连接&#xff0c; 连接的建立通过三次握手&#xff0c;释放则需要四次握手…

用Roofline模型去分析pytorch和Triton算子

用Roofline模型去分析pytorch和Triton算子 1.参考链接2.测试环境3.安装相关依赖4.锁频5.获取理论算力6.创建测试脚本7.运行测试程序生成Roofline图8.NVIDIA Nsight Compute生成Roofline9.效果图A.nn.LinearB.Triton实现 本文演示了如何用Roofline模型去分析pytorch和Triton算子…

【银河麒麟】unzip程序卡住,处理机制详解,附代码

1.服务器环境以及配置 【机型】 处理器&#xff1a; HUAWEI,Kunpeng 920 内存&#xff1a; 400G 【内核版本】 4.19.90-23.18.v2101.ky10.aarch64 【OS镜像版本】 银河麒麟高级服务器操作系统V10-SP1-0711-arm 【第三方软件】 docker 2.问题现象描述 一台k8s服务器…

水上实用救生工具_救生拉杆_鼎跃安全

每年&#xff0c;由于水上事故而失去生命的人数不胜数&#xff0c;水上安全问题也成为公众关注的焦点。如何在关键时刻实施有效的救援&#xff0c;成为保障生命的重要课题。作为水上救援的重要工具&#xff0c;救生拉杆在紧急情况下发挥了无可替代的作用。 救生拉杆&#xff0c…

springboot 缓存框架Cache整合redis组成二级缓存

springboot 缓存框架Cache整合redis组成二级缓存 项目性能优化的解决方案除开硬件外的方案无非就是优化sql&#xff0c;减少sql 的执行时间&#xff0c;合理运用缓存让同样的请求和数据库之间的连接尽量减少&#xff0c;内存的处理速度肯定比直接查询数据库来的要快一些。今天就…

CDP问卷的常见问题

CDP问卷的常见问题可以归纳如下&#xff1a; 哪些企业会收到CDP邀请&#xff1f; 企业会收到来自投资和/或采购机构的邀请&#xff0c;以填写CDP问卷并披露相应的环境管理信息。 未收到邀请的企业可否填报&#xff1f; 未收到邀请的企业可以选择自行填报。他们需发送申请自愿…