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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何预防和处理他人盗用IP地址?

IP地址的定义及作用 解释 IP 地址在互联网中的作用。它是唯一标识网络设备的数字地址,类似于物理世界中的邮政地址。 1、IP地址盗窃的定义 解释一下什么是IP地址盗用,即非法使用他人的IP地址或者伪造IP地址的行为,这种行为可能引发法律和安…

DV SSL证书如何升级到OV SSL 证书

随着互联网的发展和用户对数据安全性的关注,越来越多的网站开始采用SSL证书来保护用户的隐私和数据。在选择SSL证书时,有些网站可能会首先选择经济实惠的DV(域名验证)证书,但随着业务的发展和用户需求的增加&#xff0…

ONLYOFFICE 8.1版本桌面编辑器测评

随着科技的进步和办公需求的不断提升,办公软件成为了日常工作中不可或缺的一部分。近日,ONLYOFFICE 推出了其最新版本的桌面编辑器——8.1版。 本文将详细介绍ONLYOFFICE 8.1版本桌面编辑器的各项新功能和改进,帮助用户了解并更好地使用这一高…

谷粒商城实战(044集群学习-redis集群)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第365p-第p367的内容 介绍 以前的分区方式 客户端分区 代理分区 高可用方式 哨兵方式(3.0以前的方式) redis-cluster分…

【区间动态规划】1771. 由子序列构造的最长回文串的长度

本文涉及知识点 动态规划汇总 LeetCode1771. 由子序列构造的最长回文串的长度 给你两个字符串 word1 和 word2 ,请你按下述方法构造一个字符串: 从 word1 中选出某个 非空 子序列 subsequence1 。 从 word2 中选出某个 非空 子序列 subsequence2 。 连…

数据结构之树的超详细讲解(附C实现代码)

目录 树的基本性质 二叉树 定义树结点结构体 建树 根据二叉树的层次遍历建树 根据前序或后序建树 遍历二叉树 前序遍历 中序遍历 后序遍历 根据前序和中序序列输出后序序列 根据后序和中序序列输出前序序列 根据前序和后序判断树的个数 求树的高度(DFS) 求树的宽…

学习笔记——动态路由——RIP(RIP路由汇总介绍)

四、RIP路由汇总介绍 当网络中路由器的路由条目非常多时,可以通过路由汇总(又称路由汇聚或路由聚合)来减少路由条目数,加快路由收敛时间和增强网络稳定性。 路由汇总的原理是,同一个自然网段内的不同子网的路由在向外…

使用语义熵检测大语言模型中的幻觉

使用语义熵检测大语言模型中的幻觉 Detecting hallucinations in large language models using semantic entropy 论文阅读摘要研究目标论文图表概述总结关键解决方案语义熵计算:虚构内容检测: 双向蕴涵在大语言模型中的应用上下文的重要性蕴涵估计器 实验设计语义熵计算步骤结…

[每周尝鲜]用GPTs排名全球Top1的 GitHub 代码仓库分析神器AI Code Analyzer解读每周热门项目

前言: GitHub 代码仓库分析神器AI Code Analyzer自1月12日在GPTs 上线以来,凭借其强大的功能和卓越的用户体验,取得了令人瞩目的成绩。收获了诸多好评,目前在同类插件中全球排行第一,已有1000用户正在使用。并且已入选…

自动化运维Ansible

目录 一、Ansible介绍 1.1 功能 1.2 特性 二、Ansible安装 2.1 yum安装 2.2 编译安装 2.3 相关文件 三、 Ansible配置和工具 3.1 主配置文件 3.2 inventory主机清单文件 3.3 ansible工具 3.4 ansible命令 3.5 ansible执行过程 四、Ansible模块 4.1 command模块 4…

Python (Ansbile)脚本高效批量管理服务器和安全

1、简介 在现代 IT 基础设施中,管理大量服务器是一项复杂而繁琐的任务。特别是在检查服务器的存活状态以及 SSH 登录等任务上,手动操作非常耗时且容易出错。本文将介绍如何使用 Python 脚本实现对多台服务器的批量检查和管理,包括检查服务器…

TCP、UDP详解

TCP和UDP是传输层的两个重要协议,也是面试中经常会被问到的,属于面试高频点。今天,我们来学习这两个协议。 1.区别 1.1 概括 TCP:有连接,可靠传输,面向字节流,全双工 UDP:无连接…

clip系列改进Lseg、 group ViT、ViLD、Glip

Lseg 在clip后面加一个分割head,然后用分割数据集有监督训练。textencoder使用clip,frozen住。 group ViT 与Lseg不同,借鉴了clip做了真正的无监督学习。 具体的通过group block来做的。使用学习的N个group token(可以理解为聚类…

探索音频创作的无限可能——Studio One 5 软件深度解析

Studio One 5 是一款功能强大且备受赞誉的音频制作软件,无论是专业音乐制作人还是业余爱好者,都能在其中找到满足自己需求的强大功能。 对于 Mac 和 Windows 用户来说,Studio One 5 提供了一个直观且友好的操作界面。其简洁明了的布局让用户…

CID引流电商:传统电商破局的新动力

摘要:CID引流电商为传统电商带来破局新机遇,通过跨平台引流、精准定位和高效转化,解决了流量获取难、成本高的问题,提升了销售业绩和市场竞争力。CID引流电商助力传统电商在激烈竞争中保持领先,推动行业持续发展。 随…

pdf转换成cad,这几个cad转换小妙招快码住!

在数字设计领域,PDF(Portable Document Format)和CAD(Computer-Aided Design)文件格式各有其独特之处。PDF常用于文件共享和打印,而CAD则是工程师和设计师们进行精确绘图和建模的必备工具。然而&#xff0c…

elasticsearch重置密码

0 案例背景 Elasticsearch三台集群环境,对外端口为6200,忘记elasticsearch密码,进行重置操作 注:若无特殊说明,三台服务器均需进行处理操作 1 停止es /rpa/bin/elasticsearch.sh stop 检查状态 ps -ef|grep elast…

基于PHP+MySQL组合开发家政预约服务小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代,家政服务行业也逐渐融入了科技的力量。为了满足市场需求,我们开发了一款基于 PHPMySQL 组合的家政预约服务小程序源码系统。该系统不仅提供了便捷的家政服务预约功能,还具备完整的安装代码包和详细的搭建教程&…

OpenCloudOS开源的操作系统

OpenCloudOS 是一款开源的操作系统,致力于提供高性能、稳定和安全的操作系统环境,以满足现代计算和应用程序的需求。它结合了现代操作系统设计的最新技术和实践,为开发者和企业提供了一个强大的平台。本文将详细介绍 OpenCloudOS 的背景、特性…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的登山之旅01(100分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…