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; }

基于深度学习的文本检索

基于深度学习的文本检索 文本检索(Text Retrieval)是指在大量文本数据中,根据用户的查询文本找到相关文档。基于深度学习的方法通过提取文本的高层次语义特征,实现了高效和准确的文本检索。 深度学习在文本检索中的优势 语义理…

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. 数据总线 双向传输总线 数…

深入解析B树:节点子节点数量的奥秘

在计算机科学中,B树是一种自平衡的树形数据结构,它能够保持数据有序,并且允许进行高效的搜索、顺序访问、插入和删除操作。B树广泛应用于数据库和文件系统的索引结构中,因为它可以有效地减少磁盘I/O操作次数。本文将深入探讨B树的…

VUE----通过nvm管理node版本

使用 NVM(Node Version Manager)来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤: 1. 安装 NVM 如果你还没有安装 NVM,可以按照以下步骤进行安装: 打开终端,运行以下命令以下载并安装 NVM: curl …

c语言中的for循环

在C语言中,for循环是控制结构之一,用于多次执行一段代码。其具体用法如下: 语法 for (初始化表达式; 条件表达式; 更新表达式) {// 循环体 }参数说明 初始化表达式:在循环开始前执行一次,用于初始化循环控制变量。条…

BeautifulSoup解析HTML

需要解析HTML源码里面的内容&#xff0c;包含特定标签和属性 <div class"file-source"><table><tr><th align"right">Line</th><th align"right">Branch</th><th align"right">Exec…

箭头函数的应用场景

箭头函数是 ES6 中新增的一种函数书写方式&#xff0c;通常用于简洁地定义匿名函数。它的应用场景包括但不限于以下几个方面&#xff1a; 1.简化回调函数&#xff1a;箭头函数可以让回调函数的书写更加简洁&#xff0c;减少代码量。 // 传统函数形式 setTimeout(function() {…

麒麟系统安装Redis

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

Linux系统中管理文件和目录权限的详细说明,部署服务器遇到文件权限的问题,就想着记录一下

Linux 文件权限基础 在Linux中&#xff0c;每个文件和目录都关联着三个类别的权限&#xff1a; 所有者&#xff08;Owner&#xff09;&#xff1a;通常是创建文件或目录的用户。组&#xff08;Group&#xff09;&#xff1a;与文件或目录关联的用户组。组成员共享文件的组权限…

【linux】socket通信代码解析

目录 一、Linux中Socket编程的基本步骤 1.1 创建Socket 1.2 绑定Socket 2.3 监听Socket(仅服务器端) 2.4 接受连接(仅服务器端) 2.5 连接Socket(仅客户端) 2.6 发送和接收数据 2.7. 关闭Socket 二、Linux中Socket编程具体实现 2.1 TCP服务器 2.2 TCP客户端 2…

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

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

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

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

项目如何整合sentinel

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