pytest系列——pytest_collection_modifyitems钩子函数修改测试用例执行顺序

news2024/11/23 22:48:49

前言

pytest默认执行用例是根据项目下的文件名称按ascii码去收集运行的;文件中的用例是从上往下按顺序执行的。

pytest_collection_modifyitems 这个函数顾名思义就是收集测试用例、改变用例的执行顺序的。

【严格意义上来说,我们在用例设计原则上用例就不要有依赖顺序,这样才能更好的体现出测试用例的意义。(测试用例的执行不需要按照顺序来执行,而是随即执行)】

1、Hook方法之 pytest_collection_modifyitems :
pytest_collection_modifyitems 是在用例收集完毕之后被调用,可以用来调整测试用例执行顺序;
它有三个参数,分别是:

session:会话对象;
config:配置对象;
items:用例对象列表;改变items里面用例的顺序就可以改变用例的执行顺序了

这三个参数分别有不同的作用,都可以拿来单独使用,修改用例执行顺序主要是使用 items 参数【用例执行之前,收集到的测试用例会以元素对象的方式存放在用例对象列表items中】
2、pytest_collection_modifyitems方法源码:
def pytest_collection_modifyitems(session, config, items):

    """ called after collection has been performed, may filter or re-order
    the items in-place.
    :param _pytest.main.Session session: the pytest session object
    :param _pytest.config.Config config: pytest config object
    :param List[_pytest.nodes.Item] items: list of item objects
    """

一、针对单个测试.py文件修改测试用例执行顺序

首先准备三个测试用例:

import pytest

class TestDemoA:

    def test_A_001(self):
        pass

    def test_A_002(self):
        pass

    def test_A_003(self):
        pass

if __name__ == '__main__':
    pytest.main(['-s'])

正常情况下pytest 会按照从上到下的顺序依次执行(模块级会先以模块名按ascii编码进行排序):

image

使用pytest_collection_modifyitems修改单个测试文件中的用例执行顺序

在 conftest.py 文件中 使用pytest_collection_modifyitems 钩子方法:

# conftest.py

# 在收集完测试用例后才会执行
def pytest_collection_modifyitems(items):
    print('pytest 收集到的所有测试用例:\n',items)

if __name__ == '__main__':
    pytest.main(['-s'])

可以看到控制台中打印出来了收集到的三个测试用例的对象,而且是在测试用例执行之前便已经收集;【先收集测试用例,然后执行测试用例】

在执行完 pytest_collection_modifyitems 之后才显示收集到了 3 个用例;

如果我们在 pytest_collection_modifyitems 中对用例进行调整,便会影响用例是否执行和执行顺序;

image

利用 items 获取收集到的用例名和用例节点:
# conftest.py

def pytest_collection_modifyitems(items):
    print('pytest 收集到的所有测试用例:\n', items)
    for item in items:
        print('---' * 10)
        print('用例名:', item.name)
        print('用例节点:', item.nodeid)

if __name__ == '__main__':
    pytest.main(['-s'])

运行结果:

image

修改用例执行顺序和剔除测试用例:
# conftest.py

def pytest_collection_modifyitems(items):
    # 将用例名拿出来存入新列表new_items
    new_items = []
    for item in items:
        new_items.append(item.name)

    # 1. 删除 test_A_002 用例
    # 获取 test_A_002 在新列表的索引
    index_2 = new_items.index('test_A_002')
    # 在老列表中删除这个索引
    del items[index_2]
    del new_items[index_2]  # 新列表同步删除,和老列表保持同步

    # 2. 调换 1 和 3 的顺序
    # 获取 1 和 3 在新列表的索引
    index_1 = new_items.index('test_A_001')
    index_3 = new_items.index('test_A_003')
    # 根据索引在老列表中调换位置
    items[index_1], items[index_3] = items[index_3], items[index_1]

运行结果:

image

可以看到控制台输出的结果中,用例3和用例1的顺序调换了,用例2由于被删除所以没有执行;

代码写的比较粗糙,但是思路就是这样:想办法干涉 items列表中用例对象的排序;

二、针对多个测试.py文件

pytest默认执行顺序

先设计一个简单的 pytest 项目,有a和b两个包,分别在 test_a.py 和 test_b.py 写测试用例

image

conftest.py内容:

import pytest

def pytest_collection_modifyitems(session, items):
    print("收集到的测试用例:%s"%items)

test_a.py内容:

def test_a_1():
    print("测试用例a_1")

def test_a_2():
    print("测试用例a_2")

test_b.py内容:

def test_b_2():
    print("测试用例b_2")

def test_b_1():
    print("测试用例b_1")

运行完成后可以看到收集到的测试用例【会在测试用例开始执行前收集】:

image

从结果可以看出运行的时候先按模块名称ascii码去收集,单个py文件里面的用例按从上到下写的顺序收集。

items用例排序

如果我想改变上面的用例执行顺序,以所有用例名称ascii码排序(测试方法名)。

先获取到收集的用例的名称,以用例名称排序就可以了。

def pytest_collection_modifyitems(session, items):
    print(type(items))
    print("收集到的测试用例:%s" % items)
    # sort排序,根据用例名称item.name的ASCII码排序
    items.sort(key=lambda x: x.name)
    print("排序后的用例:%s" % items)
    for item in items:
        print("用例名:%s" % item.name)

重新执行后结果:

image

重新排序后就可以按用例的名称ascii码顺序执行了。

 自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

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

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

相关文章

NFTScan | 11.20~11.26 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.11.20~ 2023.11.26 NFT Hot News 01/ OKX Ordinals 市场 API 完成升级 11 月 21 日,OKX Ordinals 市场 API 现已完成升级,新增支持按币种单价查询、排序&…

TDA4VM EVM开发板调试笔记

文章目录 1. 前言2. 官网资料导读3. 安装 Linux SDK4. 制作SD 启动卡5. 验证启动1. 前言 TDA4作为一般经典的车规级SOC芯片,基于它的低阶智驾方案目前成为各家智驾方案公司的量产首选,这也使得基于TDA4的开发需求陡增,开发和使用TDA4既要熟悉Linux驱应用开发,还要熟悉传统…

uniapp基础-教程之HBuilderX配置篇-01

uniapp教程之HBuilderX配置篇-01 为什么要做这个教程的梳理,主要用于自己学习和总结,利于增加自己的积累和记忆。首先下载HBuilderX,并保证你的软件在C盘进行运行,最好使用英文或者拼音,这个操作是为了保证软件的稳定…

瑞芯微RK3588核心板在网络录像机产品中的应用与优势-迅为电子

你是否曾经想过,网络录像机是如何工作的?为什么它可以在没有电脑的情况下进行录像和监控?答案是,它依赖于RK3588核心板。那么,RK3588核心板到底在网络录像机产品中扮演着什么样的角色呢?它又具有哪些优势呢…

力扣:239. 滑动窗口最大值

题目&#xff1a; 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 提示&#xff1a; 1 < nums.length < 10^5-10^4 < n…

使用UI Automation库用于UI自动化测试

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

NX二次开发UF_CURVE_ask_spline_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_spline_data Defined in: uf_curve.h int UF_CURVE_ask_spline_data(tag_t spline_tag, UF_CURVE_spline_p_t spline_data ) overview 概述 Reads the spline data a…

FreeRTOS-任务管理

目录 任务管理 创建任务 创建任务示例1&#xff1a;创建两个同等级的任务 创建任务示例2&#xff1a;使用任务参数 删除任务 删除任务示例&#xff1a;删除任务 挂起任务 任务优先级 优先级实验&#xff1a;修改优先级 Tick 延时函数 延时示例 空闲任务 钩子函数…

创意二维码案例:意大利艺术家的最新二维码艺术展!

意大利艺术家——米开朗基罗皮斯特莱托&#xff08;Michelangelo Pistoletto&#xff09;的个人艺术展“二维码‘说’”&#xff08;QR CODE POSSESSION&#xff09;正在北京798艺术区的常青艺术画廊展出&#xff0c;这是一次别出心裁的创意艺术展&#xff01; 主要体现在3个方…

案例036:基于微信小程序的在线课堂系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

2019年3月28日 Go生态洞察:Go 2018调查结果分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

数据结构与算法编程题29

先序遍历二叉树&#xff08;非递归&#xff09;栈 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;B…

BetaFlight模块设计之三十七:SBUS

BetaFlight模块设计之三十七&#xff1a;SBUS 1. 源由2. sbus启动&动态任务3. 主要函数3.1 sbus初始化3.2 sbusFrameStatus更新3.3 rxFrameTimeUs3.4 sbusDataReceive接收数据 4. 辅助函数4.1 sbusChannelsDecode 5. 参考资料 1. 源由 接着BetaFlight模块设计之三十六&…

西北大学计算机844考研-23年计网计算题详细解析

西北大学计算机844考研-23年计网计算题详细解析 1.计算无传输差错状态下停止—等待ARQ协议效率,电磁波传播速率为2*10^8m/s&#xff0c;链路长为2000m&#xff0c;帧长度为1000比特&#xff0c;计算传输速率10kbps及10Mbps时的协议效率&#xff08;即信道利用率&#xff09; …

医院绩效考核管理系统项目源码

医院绩效考核体系该如何完善 一、合理制定绩效指标 绩效指标是医院绩效考核体系的重要部分&#xff0c; 而医院各科室的工作方法和目的各不相同、职责也不同。因此&#xff0c;医院要重视绩效指标的制定&#xff0c;并且从实际出发&#xff0c;根据各科室情况合理制定个性化的…

Pytorch 基于 deeplabv3_resnet50 迁移训练自己的图像语义分割模型

一、图像语义分割 图像语义分割是计算机视觉领域的一项重要任务&#xff0c;旨在将图像中的每个像素分配到其所属的语义类别&#xff0c;从而实现对图像内容的细粒度理解。与目标检测不同&#xff0c;图像语义分割要求对图像中的每个像素进行分类&#xff0c;而不仅仅是确定物…

华夏ERP信息泄露漏漏洞复现 [附POC]

文章目录 华夏ERP信息泄露漏漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 华夏ERP信息泄露漏漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#x…

深思:C与C++相互调用问题

背景 上周&#xff0c;偶然看到同事愁眉苦脸的样子&#xff0c;便善意咨询了下发生了什么。简单沟通下&#xff0c;才知道他遇到了一个工程编译的问题&#xff0c;一直无法编译通过&#xff0c;困扰了他快一天时间。出于个人的求知欲和知识的渴望&#xff0c;我便主动与他一同分…

动态规划学习——等差子序列问题

目录 一&#xff0c;最长等差子序列 1.题目 2.题目接口 3.解题思路及其代码 二&#xff0c;等差序列的划分——子序列 1.题目 2.题目接口 3.解题思路及其代码 一&#xff0c;最长等差子序列 1.题目 给你一个整数数组 nums&#xff0c;返回 nums 中最长等差子序列的长度…

M3u8视频文件怎么转换成MP4?一分钟解决!

大部分网课平台或者视频平台&#xff0c;都是基于m3u8格式的&#xff0c;这是因为m3u8格式本身的特点&#xff0c;既支持直播又支持点播。但是往往在其他平台或者设备上不兼容&#xff0c;就需要转成MP4格式&#xff0c;那么就像大家介绍3种好用的方法~ 方法一&#xff1a;使用…