pytest测试框架之插件(hook函数)开发

pytest测试框架之插件(hook函数)开发

参考文档:
https://docs.pytest.org/en/7.1.x/how-to/writing_hook_functions.html
https://juejin.cn/post/7281080420379131958
https://zhuanlan.zhihu.com/p/610804545

pytest 三种插件

pytest 给我们开放了大量的 hook 函数,可以编写插件。pytest 三种插件类型:

  1. 内置插件:从 pytest 内部 _pytest 目录加载的插件
  2. 外部插件:通过 pip 安装的插件(比如: pip install pytest-ordering )
  3. conftest.py 插件:测试目录中的 conftest.py 加载

pytest hook 函数

pytest hook 链接: https://docs.pytest.org/en/stable/reference.html?#hooks
pytest hook 函数也叫钩子函数,pytest 提供了大量的钩子函数,可以在用例的不同生命周期自动调用。 比如,在测试用例收集阶段,可利用 hook 函数修改测试用例名称的编码。
通常我们会把 hook 函数编写在项目的 conftest.py 文件中:

def pytest_collection_modifyitems(session: "Session", config: "Config", items: List["Item"]
) -> None:for item in items:item.name = item.name.encode('utf-8').decode('unicode-escape')item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

运行时,pytest 会优先加载 conftest.py 文件,然后再执行测试用例,这个 hook 函数 pytest_collection_modifyitems 是负责修改收集上来的测试用例的,也就是我们可以将收集上来的 测试用例重新改写它的编码规范,当然也可以修改它的执行顺序。下面我们来看一下 pytest 提供了哪些 hook 函数。

pytest hook函数及执行顺序

pytest 提供了大量的 hook 函数,执行过程中几乎所有的行为都是可以定制的。文字版 pytest hook 执行顺序:

root
└── pytest_cmdline_main├── pytest_plugin_registered├── pytest_configure│ └── pytest_plugin_registered├── pytest_sessionstart│ ├── pytest_plugin_registered│ └── pytest_report_header├── pytest_collection│ ├── pytest_collectstart│ ├── pytest_make_collect_report│ │ ├── pytest_collect_file│ │ │ └── pytest_pycollect_makemodule│ │ └── pytest_pycollect_makeitem│ │ └── pytest_generate_tests│ │ └── pytest_make_parametrize_id│ ├── pytest_collectreport│ ├── pytest_itemcollected│ ├── pytest_collection_modifyitems│ └── pytest_collection_finish│ └── pytest_report_collectionfinish├── pytest_runtestloop│ └── pytest_runtest_protocol│ ├── pytest_runtest_logstart│ ├── pytest_runtest_setup│ │ └── pytest_fixture_setup│ ├── pytest_runtest_makereport│ ├── pytest_runtest_logreport│ │ └── pytest_report_teststatus│ ├── pytest_runtest_call│ │ └── pytest_pyfunc_call│ ├── pytest_runtest_teardown│ │ └── pytest_fixture_post_finalizer│ └── pytest_runtest_logfinish├── pytest_sessionfinish│ └── pytest_terminal_summary└── pytest_unconfigure

pytest_collection_modifyitems

运行测试用例的时候,可能会遇到编码的问题,比如路径里有中文,展示的时候,可能会出现乱码。

需求&源码分析

从源码 site_packages/_pytest/hookspec.py 中(ubuntu18系统通常位置在家目录./lib/python3.6/site-packages/_pytest/hookspec.py)查看 pytest_collection_modifyitems hook函 数的源码:

def pytest_collection_modifyitems(session, config, items):""" called after collection has been performed, may filter or re-orderthe 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"""

该函数是在用例收集完毕之后被调用,可以过滤或者调整测试用例执行顺序。 里面需要传递三个参数,其中 items 是测试的用例对象列表。可以通过遍历 items,然后对每个测试用例的名字重新编码,实现改写编码的效果。

item常用属性

item.nodeid: 返回一个字符串,表示测试用例的唯一标识符。
item.name: 返回一个字符串,表示测试用例的名称。
item.parent: 返回一个节点对象,表示测试用例所属的父级节点(模块、类或测试集合)。
item.function: 返回一个函数对象,表示测试用例的实际执行函数。
item.originalname: 返回一个字符串,表示测试用例的原始名称。
item.location: 返回一个元组,包含测试用例所在文件的路径和行号。
item.keywords:返回一个包含字符串关键字的集合

hook函数本文件夹下生效

创建目录结构如下:
pytest-changcode
├── pytest_changecode
│ └── init.py
└── tests
└── test_code.py
创建插件包 pytest_changecode ,创建测试包 tests
在 tests/test_code.py 文件中添加测试代码,如下:

@pytest.mark.parametrize("name",["张三","李四"])
def test_encode(name):print(name)

在pytest_changecode/init.py 文件中添加改写编码的内容,代码如下:

def pytest_collection_modifyitems(items):
for item in items:
item.name = item.name.encode(‘utf-8’).decode(‘unicode_escape’)
item._nodeid = item._nodeid.encode(‘utf-8’).decode(‘unicode_escape’)

hook函数全局生效

把 hook 函数编写在项目的 conftest.py 文件中

def pytest_collection_modifyitems(session: "Session", config: "Config", items: List["Item"]
) -> None:for item in items:item.name = item.name.encode('utf-8').decode('unicode-escape')item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

运行机制总结

pytest_collection_modifyitems()钩子函数的运行机制如下:

在 Pytest 运行过程中,当测试集被收集完成后,Pytest 会检测到conftest.py文件中是否定义了 pytest_collection_modifyitems() 函数。
如果 conftest.py中定义了 pytest_collection_modifyitems() 函数,Pytest 会调用该函数,并传递两个参数:config 和 items。config 参数是一个对象,包含了当前测试运行的配置信息。我们可以使用它来访问和修改配置选项,或者获取有关测试环境和命令行参数的信息。
items 参数是一个列表,其中包含了所有收集到的测试项对象。每个测试项对象都包含了测试项的相关信息,如名称、路径、函数/方法定义等。
在 pytest_collection_modifyitems() 函数内部,我们可以根据需要对 items 列表进行修改。例如,重新排序测试项、过滤测试项、添加标记等。修改 items 列表后,Pytest 将按更新后的顺序和配置继续执行测试。修改后的 items 列表中包含了经过钩子函数处理后的测试项。

总结来说,pytest_collection_modifyitems() 钩子函数在测试集被收集之后被调用,允许我们对收集到的测试项进行自定义修改。通过使用该钩子函数,我们可以根据特定需求实现对测试项的排序、过滤、标记等操作,从而更好地管理和执行测试。

拓展:添加用例id用于生成xml报告

def pytest_collection_modifyitems(items):for item in items:case_id = item.namecase_id = case_id.split("[")[-1].split("]")[0].split("-")[-1]if case_id.isdigit():item.user_properties.append(("id", case_id))

item.user_properties是一个可供用户自定义使用的变量。在这里插入图片描述

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

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

相关文章

围剿尚未终止 库迪深陷瑞幸9.9阳谋

文|智能相对论 作者|霖霖 总能被“累了困了”的打工人优先pick的咖啡,刚复工就顺利站上话题C位。 #瑞幸9.9元一杯活动缩水#的话题才爬上新浪微博热搜,“库迪咖啡河北分公司运营总监带头坑害河北联营商”的实名举报帖就出现在了小红书,一时…

【Oracle】玩转Oracle数据库(五):PL/SQL编程

前言 嗨,各位数据库达人!准备好迎接数据库编程的新挑战了吗?今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程!🔮💻 在这篇博文【Oracle】玩转Oracle数据库(五)&#xff1…

three.js第一个3D案例

在正式学习Three.js之前,先做一些必要的准备工作,具体说就是下载threejs官方文件包,threejs官方文件包提供了很多有用的学习资源。 threejs官方文件包所有版本:https://github.com/mrdoob/three.js/releases threejs文件资源目录…

vue-nextTick(nextTick---入门到离职系列)

官方定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 个人理解 假设我们更改了某个 dom 元素内部的文本&#xff0c;而这时候我们想直接打印这个更改之后的文本是需要 dom 更新之后才会实现的。 小案例 <tem…

踩坑:SpringBoot连接Mysql的时区报错

解决方法&#xff1a;1.修改时区2.修改连接版本 目录 1.修改时区 2.切换版本 1.修改时区 查看mysql的默认时区 SELECT global.time_zone AS Global Time Zone, session.time_zone AS Session Time Zone; 查看mysqk的默认是时区返回两个结果 Global Time Zone:表示Mysql…

高级语言期末2011级A卷

1.编写函数&#xff0c;判定正整数m和n&#xff08;均至少为2&#xff09;是否满足&#xff1a;数m为数n可分解的最小质因数&#xff08;数n可分解的最小质因数为整除n的最小质数&#xff09; 提示&#xff1a;判定m为质数且m是n的最小因数 #include <stdio.h> #include…

Jqgrid入门

最近要用Jqgrid做项目&#xff0c;之前都没怎么接触过&#xff0c;看了看官网有一个小demo&#xff0c;于是下下来后&#xff0c;发现这个demo有点问题&#xff0c;度娘了一下&#xff0c;发现有的博主直接贴官网的代码&#xff0c;截了个图&#xff0c;我真是***&#xff0c;还…

科普GAI:走进生成式人工智能的世界

今天&#xff0c;我们来聊聊一个科技界热门话题——GAI&#xff08;Generative Artificial Intelligence&#xff09;&#xff0c;也就是生成式人工智能。顾名思义&#xff0c;GAI是指那些能够自己“生”出新内容的人工智能系统&#xff0c;就像一位永不停歇的创新者&#xff0…

【网站项目】488服装店销售管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法

方法步骤简要 查看你的Flutter项目需要什么版本的 Gradle 插件&#xff1a; 下载这个插件&#xff1a; 方法一&#xff1a;浏览器输入&#xff1a;https://services.gradle.org/distributions/gradle-7.6.3-all.zip 方法二&#xff1a;去Gradle官网找对应的版本&#xff1a;h…

B树的介绍

R-B Tree 简介特性B树特性m阶B树的性质&#xff08;这些性质是B树规定的&#xff09; B树的搜索B树的添加B树的删除——非叶子结点 简介 R-B Tree又称为Red-Black Tree&#xff0c;红黑树。是一种特殊的二叉查找树&#xff0c;红黑树的每个节点上都有存储为表示结点的颜色&…

第四章:初阶试炼(三)---类和对象(下)

目录 前言&#x1f34f; 1. 再谈构造函数&#x1f34e; 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. Static成员&#x1f34a; 2.1 概念 2.2 特性 3. 友元&#x1f350; 3.1 友元函数 3.1.1 实现自定义类型流插入 3.1.2 实现多组流插入 3.1.3 实现自…

HC595级联原理及实例 - STM32

74HC595的最重要的功能就是&#xff1a;串行输入&#xff0c;并行输出。其次&#xff0c;74HC595里面有2个8位寄存器&#xff1a;移位寄存器、存储寄存器。74HC595的数据来源只有一个口&#xff0c;一次只能输入一个位&#xff0c;那么连续输入8次&#xff0c;就可以积攒为一个…

Guitar Pro8.2吉他乐谱软件功能测评评价

Guitar Pro 8.2吉他乐谱软件全面评价 Guitar Pro 8.2作为一款吉他乐谱软件&#xff0c;已经得到了广大吉他手和音乐制作人的认可。作为软件评价专家&#xff0c;我对这款软件进行了全面的体验和分析&#xff0c;以下是我在易用性、功能丰富性、用户界面设计、稳定性以及性价比…

从事通讯信息类职业岗位的任职资格

通讯信息工程师&#xff0c;主要是移动核心网和固网核心网的工程切割和维护网络安全的专业工作&#xff0c;主要负责IP数据、省网和地域网络的维护。一切跟互联网打交道的事情&#xff0c;都跟这个有关系&#xff0c;都是通讯信息类岗位的工作。从事这种工作&#xff0c;需要付…

AI:135-基于卷积神经网络的艺术品瑕疵检测与修复

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

高通XBL阶段读取分区

【需求】&#xff1a; 在某些场景下&#xff0c;需要在XBL阶段读取分区数据&#xff0c;需要验证xbl阶段方案 这里主要以裸分区为例&#xff0c;比如oem分区。 1、创建一个1MB大小的oem.img&#xff0c;写入内容“test oem partition” 创建方式&#xff1a; dd if/dev/null …

【Linux】部署单机项目(自动化启动)---(图文并茂详细讲解)

目录 一 准备工作 1.1 连接服务器拷贝文件 1.2 解压 二 JDK安装 2.1 配置坏境变量 2.2 查看版本 三 Tomcat(自启动) 3.1 复制启动命令的位置 3.2 添加命令相关配置文件 3.2.1 配置jdk及tomcat目录 3.2.2 添加优先级 3.3 设置自启动命令 3.4 开放端口 四 My…

浅析Linux设备驱动:DMA内存映射

文章目录 概述DMA与Cache一致性DMA映射类型一致性DMA映射dma_alloc_coherent 流式DMA映射dma_map_single数据同步操作dma_direct_sync_single_for_cpudma_direct_sync_single_for_device 相关参考 概述 现代计算机系统中&#xff0c;CPU访问内存需要经过Cache&#xff0c;但外…

16. BI - 推荐系统之 ALS 实现

本文为 「茶桁的 AI 秘籍 - BI 篇 第 16 篇」 文章目录 对 MovieLens 进行电影推荐 Hi,你好。我是茶桁。 前面两节课的内容中&#xff0c;我们从矩阵分解到 ALS 原理&#xff0c;依次给大家讲解了推荐系统中的一个核心概念。 矩阵分解中拆矩阵的背后其实是聚类。就说 k 等于几…