利用 Pytest Cache Fixture 实现中间数据缓存

接口自动化过程中,经常会遇到这样一些场景,“请求2需要用到请求1响应的数据”,常见的做法,进行用例依赖或者将请求1的响应结果写入一个文件,用到的时候读取文件。

当然这都不是这篇文章的重点,本片文章主要介绍cache写入和读取缓存数据。

request.config.cache

还不了解request fixture的同学可以先看看前面一篇文章,《pytest 的 request fixture:实现个性化测试需求》

我们先看看使用案例:

def test_01(cache):cache.set("token", "uiouoouoiou")def test_02(cache):r = cache.get("token", None)

这样段代码在执行test_01会将token值缓存,任何执行test_02时就可以从缓存中读取token值。

那Cache是如何实现的呢?我们一起来看看源码。

源码直达(https://github.com/pytest-dev/pytest/blob/main/src/_pytest/cacheprovider.py)

实现原理

def test_01(cache):cache.set("token", {"token": "1212121"})

我们在cache.set()这一行进行断点,debug执行后,debug结果为

cache = Cache()
_CACHE_PREFIX_DIRS = 'd'
_CACHE_PREFIX_VALUES = 'v'
_cachedir = /PycharmProjects/panda-test/org/.pytest_cache
_config = <_pytest.config.Config object at 0x109e80d60>

可以看到会自动创建一个缓存实例,而且初始化了一些数据,默认应该缓存文件会在.pytest_cache目录下

/_pytest/cacheprovider.py

@fixture
def cache(request: FixtureRequest) -> Cache:"""Return a cache object that can persist state between testing sessions.cache.get(key, default)cache.set(key, value)Keys must be ``/`` separated strings, where the first part is usually thename of your plugin or application to avoid clashes with other cache users.Values can be any object handled by the json stdlib module."""assert request.config.cache is not Nonereturn request.config.cache

可以看到,cache返回的是Cache对象,我们看看Cache对象是如何实现的

def set(self, key: str, value: object) -> None:path = self._getvaluepath(key)try:if path.parent.is_dir():cache_dir_exists_already = Trueelse:cache_dir_exists_already = self._cachedir.exists()path.parent.mkdir(exist_ok=True, parents=True)except OSError:self.warn("could not create cache path {path}", path=path, _ispytest=True)returnif not cache_dir_exists_already:self._ensure_supporting_files()data = json.dumps(value, ensure_ascii=False, indent=2)try:f = path.open("w", encoding="UTF-8")except OSError:self.warn("cache could not write path {path}", path=path, _ispytest=True)else:with f:f.write(data)

这段源码就是用来将键值对保存到缓存中。

代码比较简单,简单解释一下:

1、获取要保存的键值对的路径:通过调用 _getvaluepath() 方法,根据给定的键(key)获取值(value)在缓存中的路径(path)。

这里的路径是一个字符串,使用/分隔不同的层级,通常第一个名称是插件或应用程序的名称。

2、检查路径是否存在:通过判断路径的父目录是否为目录来确定是否需要创建路径。

如果父目录已经存在,则 cache_dir_exists_already 设置为 True;

否则,它会检查缓存目录是否存在,并且如果缓存目录已经存在,则 cache_dir_exists_already 设置为 True,否则创建缓存目录。

3、确保支持文件已存在:如果缓存目录是新创建的,则调用 _ensure_supporting_files() 方法确保支持文件存在。

这个方法可能是用来创建其他与缓存相关的文件或目录。

4、序列化数据并写入文件:将值(value)使用 JSON 格式进行序列化,以确保它是基本的 Python 类型或包含了嵌套类型(例如列表和字典)。

然后,尝试打开路径对应的文件(使用 UTF-8 编码),并将序列化后的数据写入文件中。

def get(self, key: str, default):path = self._getvaluepath(key)try:with path.open("r", encoding="UTF-8") as f:return json.load(f)except (ValueError, OSError):return default

这段源码用来从缓存中获取指定键的值,简单解释一下:

1、获取要获取值的路径:通过调用 _getvaluepath() 方法,根据给定的键(key)获取值在缓存中的路径(path)。

这里的路径是一个字符串,使用 / 分隔不同的层级,通常第一个名称是插件或应用程序的名称。

2、尝试读取文件并返回已缓存的值:使用路径对应的文件(使用 UTF-8 编码)打开,并使用 json.load(f) 将文件中的数据加载为 Python 对象。

然后将加载的值返回。

3、处理异常情况:如果无法将文件中的内容解析为有效的 JSON 数据或者打开文件失败,则捕获异常(ValueError 和 OSError),并返回默认值(default)。

这里还是学习到了一种新奇的写法,以前没用过with path.open(“r”, encoding=“UTF-8”) as f:等价于open(path, “r”, encoding=“UTF-8”)

这是两个常用的方法,当然还提供了更多方法,这里简单介绍一下:

1、init(self, cachedir: Path, config: Config, *, _ispytest: bool = False) -> None:

初始化方法,用于设置类的属性 _cachedir 和 _config。

2、for_config(cls, config: Config, *, _ispytest: bool = False) -> “Cache”:

类方法,根据给定的配置信息创建并返回 Cache 实例。

如果配置项 cacheclear 设置为 True,并且缓存目录存在,则调用 clear_cache 方法清空缓存。

最后返回一个新的 Cache 实例。

3、clear_cache(cls, cachedir: Path, _ispytest: bool = False) -> None:

类方法,清空缓存目录下的子目录。

根据参数 cachedir 构建子目录路径,并使用 rm_rf 函数递归删除该目录。

4、cache_dir_from_config(config: Config, *, _ispytest: bool = False) -> Path:

静态方法,从给定的配置信息中获取缓存目录的路径。

首先从配置中获取缓存目录的字符串表示,然后使用 resolve_from_str 函数将其解析为 Path 对象返回。

5、warn(self, fmt: str, *, _ispytest: bool = False, **args: object) -> None:

发出缓存警告的方法。

使用 warnings.warn 函数发出警告信息,并指定警告类型为 PytestCacheWarning。

如果存在参数 args,则将其作为格式化参数替换格式字符串中的占位符。

6、mkdir(self, name: str) -> Path:

创建一个目录路径对象,并在缓存目录下创建该目录。

参数 name 是要创建的目录名称。

检查目录名是否包含路径分隔符 /,如果有则抛出异常。

使用 _cachedir.joinpath 方法构建完整的目录路径,并使用 mkdir 方法创建目录。

返回创建的目录路径对象。

7、_getvaluepath(self, key: str) -> Path:

根据给定的键生成值文件的路径。

在缓存目录下构建值文件路径,使用 _CACHE_PREFIX_VALUES 作为子目录前缀。

8、_ensure_supporting_files(self) -> None:

创建缓存目录中的支持文件。

创建 README.md 文件,用于说明缓存目录的用途。

创建 .gitignore 文件,忽略缓存目录下的所有文件。

创建 CACHEDIR.TAG 文件,用于标记缓存目录。

最后

cache功能还是很实用的,比如登录功能,可以在登录之后,将token写入缓存,这样进行其他接口请求时,需要token时直接从缓存获取token即可。

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


这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

 

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

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

相关文章

macos MacPort 包管理工具安装和使用

在macos v10.15版本中, xz, python等软件无法使用brew安装, 原因是brew对于旧版本的macos不再支持, 但是我们可以使用另外一个macos下的包管理工具来安装brew无法安装的软件, macport 是一个和brew类似的macos下的一个非常优秀的软件包安装管理工具. MacPort安装前提条件 安…

假期学习--对象底层结构和继承链

OC本质底层实现转化其实都是C/C代码。 OC对象的本质就是结构体。 NSObject底层是struct objc_object结构体 &#xff1b;struct objc_class : objc_object { …省略无关代码 // Class ISA; //ISA(从objc_object继承过来的) Class superclass; //指向其父类 cache_t cache…

旅游行业怎么利用C#接口发送短信

旅游企业一般拥有众多的分支机构&#xff0c;同时各地分支机构又有众多下属分散在当地各区的旅游营业报名点&#xff0c;以前传统的解决方案是采用专线、MODEM拔号等方式&#xff0c;专线的成本很高&#xff0c;MODEM拔号更费时&#xff0c;且长途拔号互联成本在多点情况下费用…

微前端集成优化:让所有子应用体积更小,加载更快!

简介 随着前端的日益发展&#xff0c;微前端架构越来越受到青睐。它通过将前端应用拆分为多个独立的子应用&#xff0c;每个子应用可以独立开发、部署和运行&#xff0c;从而提升了开发效率和团队协作。目前主流的微前端方案应该是qiankun了。 以笔者公司为例&#xff0c;采用…

基于SpringBoot的在线答疑系统

你好呀&#xff0c;我是计算机专业毕业生&#xff0c;专注于在线教育平台的开发与实现。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术 Spring Boot框架 工具&#xff1a;IntelliJ IDEA、Navicat、Maven、Tomcat 系统展示 首页 个人中心…

scrapy--图片管道-ImagesPipeline

免责声明:本文仅做演示与分享~ 目录 介绍 ImagesPipeline pipelines.py items.py zz.py settings.py 介绍 scrapy 还提供了处理图片、视频、音频等媒体文件的插件&#xff0c;如&#xff1a; - scrapy-images&#xff1a;用于下载和处理图片 - scrapy-video&#xff1…

责任链设计模式详解

责任链设计模式详解 一、定义 责任链设计模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许多个对象有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连接成一条链&#xff0c;并沿着…

提前还房贷结果失败了该怎么办?需要注意哪些?怎么做更顺利?

提前还房贷结果失败了&#xff0c;该怎么办&#xff1f; 1. 满足条件再申请&#xff1a;部分银行对提前还款设有一定的条件和限制&#xff0c;例如需要提前预约&#xff0c;对已还款时间和还款金额也有具体的要求。如果借款人未能满足这些条件&#xff0c;提前还款的申请可能会…

【精选】计算机毕业设计之:基于springboot超市进销存系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Stable Diffusion AI绘画工具的安装与配置(MAC用户)

AI绘画的热潮席卷了整个创意行业&#xff0c;Stable Diffusion作为其中的翘楚&#xff0c;让艺术创作变得前所未有的简单。然而&#xff0c;对于使用Mac电脑用户来说&#xff0c;安装和配置Stable Diffusion可能显得有些棘手。别担心&#xff0c;这份详细的教程将手把手教你如何…

【Material-UI】Select 组件中的 `Auto width`、`Small Size` 和 `Other Props` 详解

文章目录 一、Select 组件概述1. 组件介绍2. Select 组件的基本结构 二、Auto width 属性详解1. Auto width 的作用2. Auto width 属性的基本用法3. Auto width 的实际应用场景 三、Small Size 属性详解1. Small Size 的作用2. Small Size 属性的基本用法3. Small Size 的实际应…

Windows怎么让防火墙开放端口

开放端口的方法 先从控制面板,进入到Windows Defender防火墙 点击高级设置,点击入站规则 点击右边的新建规则,点击端口,点击下一步 选择协议类型和端口号点击下一步即可 查看是否开放端口成功的方法: 进入任务管

【rk3588】环境搭建及系统编译

开发板&#xff1a;ROC-RK3588S-PC 官方链接&#xff1a;Welcome to ROC-RK3588S-PC Manual — Firefly Wiki (t-firefly.com) 串口调试配置 一、产品介绍 — Firefly Wiki (t-firefly.com)&#xff0c;可以按照官方链接的说明在个人PC上使用串口。这个串口会输出rk3588的日…

【Python机器学习】NLP词频背后的含义——从词频到主题得分

目录 TF-IDF向量及词形归并 主题向量 一个思想实验 一个主题评分算法 一个LDA分类器 LDiA TF-IDF向量&#xff08;词项频率—逆文档频率向量&#xff09;可以帮助我们估算词在文本块中的重要度&#xff0c;我们使用TF-IDF向量和矩阵可以表明每个词对于文档集合中的一小段…

计算机视觉编程 1(图片处理)

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

Java基础——自学习使用(泛型)

一、泛型的定义 泛型的本质是参数化类型&#xff0c;也就是所操作的数据类型被指定为一个参数。 泛型泛指一切类型&#xff0c;能够代表一切类型&#xff0c;是一种在编程中广泛使用的概念&#xff0c;特别是在面向对象编程中。它允许在编写代码时使用类型参数&#xff0c;这些…

MES管理系统助力印刷企业实现智能化工艺流程

在印刷这一古老而充满活力的行业中&#xff0c;科技的浪潮正以前所未有的速度重塑着每一个生产环节。随着制造业数字化转型的深入&#xff0c;引入MES管理系统&#xff0c;为印刷企业带来了从原材料入库到成品出库的全流程智能化变革&#xff0c;不仅提升了生产效率&#xff0c…

剪辑小白必看:好用的剪辑工具推荐!

作为一位热爱创作的视频制作者&#xff0c;我尝试过不少剪辑软件&#xff0c;今天我想分享自己对福昕视频剪辑、爱拍剪辑、达芬奇和VSDC Video Editor这四款软件的使用体验。 福昕视频剪辑 链接&#xff1a;www.pdf365.cn/foxit-clip/ 我第一次接触到福昕视频剪辑是在朋友的…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…

2012-2022年各省新质生产力匹配数字经济数据

2012-2022年各省新质生产力匹配数字经济数据 1、时间&#xff1a;2012-2022年 2、来源&#xff1a;各省年鉴、能源年鉴、工业年鉴、统计年鉴 3、指标&#xff1a;prov、year、gdp亿元、在岗职工工资元、第三产业就业比重、人均受教育平均年限、教育经费强度、在校学生结构、…