无需修改代码,深入探究 pytest 如何自动查找并加载三方插件

news2024/11/20 4:57:49

相信测试的同学或者python开发同学,都知道pytest框架,pytest不仅是一个功能强大的测试框架,同时还是一个插件化的测试平台。

插件只需配置就可以直接使用,而不需要测试代码配合。如果安装了插件,pytest则可以自动查找并集成它。

是不是很神奇?到底如何实现的呢?本章内容我们来揭秘。

从例子入手

我们需要将一条case执行很多遍,pytest中如何实现呢?只需要安装pytest-repeat即可实现。

安装

pip install pytest-repeat

使用

test_demo.py

import pytest


@pytest.mark.repeat(5)
def test_add():
    print("test add()")

然后我们运行这条用例,会发现用例会重复执行5次。

可以看到,我们只是安装配置之后就可以使用了,到底是如何做的呢?

原理

pytest 的插件系统基于setuptools 提供的 entry_points功能,允许开发者以插件的形式扩展 pytest 的功能。

通过在项目的 setup.py 或 pyproject.toml 文件中指定插件的入口点,pytest 在加载测试时会自动检测并加载这些插件。

一旦插件被加载,pytest 就能够根据插件所提供的功能进行相应的操作,而不需要测试代码做任何修改。插件可以用于添加自定义的命令行选项、定义自定义的标记、注册自定义的 fixture,甚至可以修改和扩展 pytest 的执行流程。

它的工作原理是,pytest 在加载插件期间会根据插件定义的 Hook 函数来调整和增强其行为。Hook 是一种回调机制,允许插件通过实现特定的函数来干预 pytest 的不同阶段,例如解析命令行参数、收集测试用例、执行测试用例等。

通过在适当的 Hook 函数中实现逻辑,插件可以影响 pytest 的行为,从而实现对框架的修改和扩展。

因此,当你在项目中安装并配置了某个 pytest 插件后,它会自动生效,并根据插件定义的逻辑进行相应的操作,而不需要测试代码配合。

这样的设计使得插件的使用变得非常灵活和方便,允许开发者根据具体需求选择和配置插件来满足自己的测试需求。

具体怎么做

开发者需要在项目的 setup.py 文件(或pyproject.toml 文件,如果使用 Poetry)中添加如下的配置:

使用 setuptools:

from setuptools import setup

setup(
    # other setup configuration...
    entry_points={
        'pytest11': [
            'plugin_name = package_name.plugin_module',
        ],
    },
)

使用 Poetry:

[tool.poetry.plugins."pytest11"]
"plugin_name" = "package_name.plugin_module"

在上述配置中,pytest11 是 pytest 插件系统所要求的 entry point group,它表示这是一个 pytest 插件。

plugin_name 是插件的名称,可以根据实际情况进行自定义,但通常遵循pytest- 的命名约定。

package_name.plugin_module 则是真正实现插件功能的模块路径。

pytest-repeat是这么做的吗

原理知道了,我们翻开pytest-repeat源码,看看是不是这样实现的!

源码:https://kgithub.com/pytest-dev/pytest-repeat

setup.py

from setuptools import setup

setup(name='pytest-repeat',
      ......
      entry_points={'pytest11': ['repeat = pytest_repeat']},
      ...... 
     )

可以看到pytest-repeat就是按照原理中介绍那样来做的。这样当项目安装了 pytest-repeat 插件之后,pytest 会自动检测到该插件,并根据插件提供的功能来运行测试用例。

通过源码可以看出,真正实现插件功能的模块在pytest_repeat.py中。

最后

这片文章主要讲述了pytest是如何自动查找集成三方插件的,要想实现一个三方插件必须在项目的setup.py文件(或者 pyproject.toml 文件)中添加配置。

之后我们来探讨,具体的插件功能到底是如何实现的呢?

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

【聊聊原子性,中断,以及nodejs中的具体示例】

什么是原子性 从一个例子说起, x ,读和写 , 如图假设多线程,线程1和线程2同时操作变量x,进行x的操作,那么由于写的过程中,都会先读一份x数据到cpu的寄存器中,所以这个时候cpu1 和 c…

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol

Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol 0. 版本0.1 ERC1967Upgrade.sol 1. 目标合约2. 代码精读2.1 _getImplementation() internal && _upgradeTo(address newImplementation) internal2.2 _upgradeToAndCall(address newImplementation,…

11--ElasticStack7-ELK+Kafka

前言:日志分析管理平台对于平时的规模化运维占的权重非常大,这一章涉及的程序较多,会将每个程序的基础使用和模块分开梳理,基础概念会分布在每小节开头,最后串联成一个完整的工作环境。 1、ELK架构 ELK 是一个非常流…

基于机器学习的永磁同步电机矢量控制策略-高分资源-下载可用!

基于机器学习的永磁同步电机矢量控制策略 优势 训练了RL-Agent,能够提高电机在非线性负载下的性能。 部分程序 仿真结果 转矩估计及dq轴电流。 代码有偿,50,需要的可以联系。

【STM32HAL库学习】通信方式:USART、IIC、SPI

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信接口区别 名称引脚双工时钟电平设备USARTTX、RX全双工异步单端点对点I2CSCL、SDA半双工同步单端多设备SPISCLK、MOSI、MISO、CS全双工同步单端多设备CANCAN_H、CAN_L半双工异步差分多设…

【antd + vue】表格行合并,同时使用插槽

一、需求说明 表格中,如果一个学校有多个考试科目,则分行展示,其余列,则合并为一行展示,如图所示 二、需求分析 1、表格行合并 相当于有4行,其中1、2行是同一个学校包含不同考试科目及对应人次的数据&am…

COB封装的LED显示屏是什么?

COB(Chip on Board)封装的LED显示屏,是一种采用先进倒装COB封装技术的显示屏,其中LED芯片是直接被安装并封装在PCB电路板上,而不是先对单个封装再焊接至电路板,与SMD(Surface Mount Device&…

Java知识点整理 18 — Lambda表达式

一. 简介 Lambda 表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。 面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口&#x…

【吴恩达机器学习-week2】可选实验:使用 Scikit-Learn 进行线性回归

支持我的工作 🎉 📃亲爱的朋友们,感谢你们一直以来对我的关注和支持! 💪🏻 为了提供更优质的内容和更有趣的创作,我付出了大量的时间和精力。如果你觉得我的内容对你有帮助或带来了欢乐&#xf…

看完这篇文章你就知道什么是未来软件开发的方向了!即生成式AI在软件开发领域的革新=CodeFlying

从最早的UGC(用户生成内容)到PGC(专业生成内容)再到AIGC(人工智能生成内容)体现了web1.0→web2.0→web3.0的发展历程。 毫无疑问UGC已经成为了当前拥有群体数量最大的内容生产方式。 同时随着人工智能技术…

SAP 表字段调整,表维护生成器调整

表维护生成器->已生成的对象->更改->专家模式

Linux下的wifi开发

了解什么是wifi 可参考: 什么是Wi-Fi?Wi-Fi和WLAN的区别是什么? - 华为 (huawei.com) WLAN的基本元素 工作站STA(Station):支持802.11标准的终端设备。例如带无线网卡的电脑、支持WLAN的手机等。 接入点AP&…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

数学建模--层次分析法~~深入解读

目录 1.基本概念 &#xff08;1&#xff09;研究案例 &#xff08;2&#xff09;模型框架 &#xff08;3&#xff09;阐述说明 &#xff08;4&#xff09;注意事项 2.模型的建立和求解 &#xff08;1&#xff09;数量级的统一 &#xff08;2&#xff09;归一化处理 &am…

用Vue3和Rough.js绘制一个粗糙的3D条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Rough.js 和 D3.js 绘制粗糙手写风格条形图 应用场景 该代码适用于需要在 Web 应用程序中创建具有粗糙手写风格的条形图的情况。它可以用于数据可视化、信息图表或任何需要以独特和有吸引力的方式呈现数…

Java StringBuffer类和StringBuilder类

在使用 StringBuffer 类时&#xff0c;每次都会对 StringBuffer 对象本身进行操作&#xff0c;而不是生成新的对象&#xff0c;所以如果需要对字符串进行修改推荐使用 StringBuffer。 StringBuilder 类在 Java 5 中被提出&#xff0c;它和 StringBuffer 之间的最大不同在于 St…

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…

IAR工程目录移动报错(改变文件目录结构)

刚开始用IAR&#xff0c;记录一下。 工作中使用华大单片机&#xff0c;例程的文件目录结构太复杂了想精简一点。 1.如果原本的C文件相对工程文件&#xff08;.eww文件&#xff09;路径变化了&#xff0c;需要先打开工程&#xff0c;再将所有的.c文件右键Add添加进工程&#xf…

【Godot4.2】Godot中的贝塞尔曲线

概述 通过指定平面上的多个点&#xff0c;然后顺次连接&#xff0c;我们可以得到折线段&#xff0c;如果闭合图形&#xff0c;就可以获得多边形。通过向量旋转我们可以获得圆等特殊图形。 但是对于任意曲线&#xff0c;我们无法使用简单的方式来获取其顶点&#xff0c;好在计…