详解如何利用Pytest Cache Fixture实现测试结果缓存

这篇文章主要为大家详细介绍了如何利用Pytest Cache Fixture实现测试结果缓存,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下−

接口自动关过程中,经常会遇到这样一些场景,"请求2需要用到请求1响应的数据",常见的做法,进行用例依赖或者将请求1的响应结果写入一个文件,用到的时候读取文件。当然这都不是这篇文章的重点,本片文章主要介绍cache写入和读取缓存数据。

request.config.cache

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

我们先看看使用案例:

  1. def test_01(cache):

  2. cache.set("token", "uiouoouoiou")

  3. def test_02(cache):

  4. r = cache.get("token", None)

这样段代码在执行test_01会将token值缓存,任何执行test_02时就可以从缓存中读取token值。那Cache是如何实现的呢?我们一起来看看源码。

实现原理

  1. def test_01(cache):

  2. 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

  1. @fixture

  2. def cache(request: FixtureRequest) -> Cache:

  3. """Return a cache object that can persist state between testing sessions.

  4. cache.get(key, default)

  5. cache.set(key, value)

  6. Keys must be ``/`` separated strings, where the first part is usually the

  7. name of your plugin or application to avoid clashes with other cache users.

  8. Values can be any object handled by the json stdlib module.

  9. """

  10. assert request.config.cache is not None

  11. return request.config.cache

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

  1. def set(self, key: str, value: object) -> None:

  2. path = self._getvaluepath(key)

  3. try:

  4. if path.parent.is_dir():

  5. cache_dir_exists_already = True

  6. else:

  7. cache_dir_exists_already = self._cachedir.exists()

  8. path.parent.mkdir(exist_ok=True, parents=True)

  9. except OSError:

  10. self.warn("could not create cache path {path}", path=path, _ispytest=True)

  11. return

  12. if not cache_dir_exists_already:

  13. self._ensure_supporting_files()

  14. data = json.dumps(value, ensure_ascii=False, indent=2)

  15. try:

  16. f = path.open("w", encoding="UTF-8")

  17. except OSError:

  18. self.warn("cache could not write path {path}", path=path, _ispytest=True)

  19. else:

  20. with f:

  21. f.write(data)

这段源码就是用来将键值对保存到缓存中。代码比较简单,简单解释一下

  • 获取要保存的键值对的路径:通过调用_getvaluepath()方法,根据给定的键(key)获取值(value)在缓存中的路径(path)。这里的路径是一个字符串,使用/分隔不同的层级,通常第一个名称是插件或应用程序的名称。

  • 检查路径是否存在:通过判断路径的父目录是否为目录来确定是否需要创建路径。如果父目录已经存在,则cache_dir_exists_already设置为True;否则,它会检查缓存目录是否存在,并且如果缓存目录已经存在,则cache_dir_exists_already设置为True,否则创建缓存目录。

  • 确保支持文件已存在:如果缓存目录是新创建的,则调用_ensure_supporting_files()方法确保支持文件存在。这个方法可能是用来创建其他与缓存相关的文件或目录。

  • 序列化数据并写入文件:将值(value)使用 JSON 格式进行序列化,以确保它是基本的 Python 类型或包含了嵌套类型(例如列表和字典)。然后,尝试打开路径对应的文件(使用 UTF-8 编码),并将序列化后的数据写入文件中。

  1. def get(self, key: str, default):

  2. path = self._getvaluepath(key)

  3. try:

  4. with path.open("r", encoding="UTF-8") as f:

  5. return json.load(f)

  6. except (ValueError, OSError):

  7. return default

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

  • 获取要获取值的路径:通过调用_getvaluepath()方法,根据给定的键(key)获取值在缓存中的路径(path)。这里的路径是一个字符串,使用/分隔不同的层级,通常第一个名称是插件或应用程序的名称。

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

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

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

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

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

初始化方法,用于设置类的属性_cachedir_config

for_config(cls, config: Config, *, _ispytest: bool = False) -> "Cache"

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

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

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

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

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

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

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

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

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

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

  • 发出缓存警告的方法。

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

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

mkdir(self, name: str) -> Path

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

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

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

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

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

_getvaluepath(self, key: str) -> Path

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

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

_ensure_supporting_files(self) -> None

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

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

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

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

最后

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

到此这篇关于详解如何利用Pytest Cache Fixture实现测试结果缓存的文章就介绍到这了。

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

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

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

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

相关文章

工业互联网平台:MGeo统一接入企业地理位置元数据

工业互联网平台&#xff1a;MGeo统一接入企业地理位置元数据 在工业互联网的数字化转型浪潮中&#xff0c;企业跨系统、跨地域的数据整合需求日益迫切。其中&#xff0c;地理位置元数据作为连接物理世界与数字孪生体的关键桥梁&#xff0c;承担着设备定位、供应链可视化、区域…

springboot基于javaweb的流浪宠物管理系统(11656)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

多人姿态识别方案PK:M2FP语义分割比关键点检测更精准?

多人姿态识别方案PK&#xff1a;M2FP语义分割比关键点检测更精准&#xff1f; &#x1f4cc; 技术背景&#xff1a;从关键点到像素级解析的演进 在计算机视觉领域&#xff0c;人体理解一直是核心任务之一。传统的人体姿态识别多依赖于关键点检测&#xff08;Keypoint Detection…

收藏!小白/程序员入门大模型避坑指南:别等“准备好”,行动才是拿Offer的关键

最近后台收到不少同学的留言&#xff0c;字里行间满是入行大模型的焦虑&#xff1a;“我还没准备好&#xff0c;现在投递是不是太晚了&#xff1f;”“八股文太多记不住&#xff0c;不敢投简历怎么办&#xff1f;” 但作为过来人想多说一句&#xff1a;在技术迭代快如闪电的AI…

Z-Image-Turbo编程教学辅助:算法流程图、数据结构图生成

Z-Image-Turbo编程教学辅助&#xff1a;算法流程图、数据结构图生成 引言&#xff1a;AI图像生成如何赋能编程教学&#xff1f; 在现代软件工程与计算机教育中&#xff0c;可视化表达已成为理解复杂系统不可或缺的一环。无论是讲解递归调用栈、排序算法执行过程&#xff0c;还是…

基于springboot的乐享田园系统(11658)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

阿里MGeo模型性能对比:中文地址相似度识别准确率超传统方法35%

阿里MGeo模型性能对比&#xff1a;中文地址相似度识别准确率超传统方法35% 背景与挑战&#xff1a;中文地址匹配为何如此困难&#xff1f; 在电商、物流、地图服务等场景中&#xff0c;地址相似度识别是实现“实体对齐”的关键环节。例如&#xff0c;用户输入的“北京市朝阳区…

真实案例:电商平台用M2FP构建虚拟试衣系统,3天完成部署

真实案例&#xff1a;电商平台用M2FP构建虚拟试衣系统&#xff0c;3天完成部署 &#x1f4cc; 业务场景与技术挑战 某中型电商平台计划上线“虚拟试衣”功能&#xff0c;目标是让用户上传全身照后&#xff0c;系统能自动识别其身体各部位&#xff08;如上衣、裤子、鞋子等&…

EasyGBS卡存录像回放指南:SD卡格式化+录像计划配置两步走

最近碰到两个用户问了一模一样的问题&#xff0c;我觉得有必要跟大伙儿唠唠&#xff01;之前有个用户&#xff0c;想在国标GB28181算法算力平台EasyGBS平台看设备端的录像回放&#xff0c;结果咋都看不到。一问才知道&#xff0c;他以为设备会默认录像&#xff0c;直接在平台看…

AI医疗影像新应用:M2FP辅助姿态分析,助力康复训练评估

AI医疗影像新应用&#xff1a;M2FP辅助姿态分析&#xff0c;助力康复训练评估 &#x1f9e9; M2FP 多人人体解析服务&#xff1a;技术背景与核心价值 在智能医疗与康复评估领域&#xff0c;精准的人体姿态理解是实现自动化、客观化训练效果评估的关键。传统动作捕捉系统依赖昂贵…

利用MGeo提升电商地址标准化效率

利用MGeo提升电商地址标准化效率 在电商平台的日常运营中&#xff0c;用户提交的收货地址往往存在大量非标准化表达&#xff1a;同一条街道可能被写作“中山路”、“中山南路”或“中山路88号”&#xff0c;小区名称可能夹杂别名、俗称甚至错别字。这种地址表述的多样性给订单…

没有NVIDIA显卡怎么办?M2FP CPU版成最佳替代方案

没有NVIDIA显卡怎么办&#xff1f;M2FP CPU版成最佳替代方案 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术痛点 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;目标是将图像…

程序员必收藏:大模型领域6大高薪转型方向及技能要求详解

文章详细介绍了程序员转型到大模型领域的六大方向&#xff1a;自然语言处理、计算机视觉、大模型算法、大模型部署和大模型产品经理。每个方向都分析了市场需求前景和具体技能要求&#xff0c;包括编程能力、数学基础、专业知识等。程序员可根据自身兴趣和优势有针对性地学习&a…

文档完善建议:提升开发者友好度的改进建议

文档完善建议&#xff1a;提升开发者友好度的改进建议 在当前 AI 模型快速迭代、开源项目层出不穷的背景下&#xff0c;一个项目的可落地性往往不只取决于模型性能本身&#xff0c;更关键的是其配套文档是否具备足够的开发者友好度。本文以阿里开源的“万物识别-中文-通用领域”…

赋能智慧环保:EasyGBS打造智能可视化城市环境监控应用方案

随着城市化进程加速&#xff0c;大气污染、水体污染、噪声扰民、垃圾堆积等环境问题日益凸显&#xff0c;传统“人工巡查定点监测”的监管模式已难以满足全域覆盖、实时响应、精准溯源的治理需求。国标GB28181算法算力平台EasyGBS的视频实时监控系统凭借全协议兼容、强算力支撑…

MGeo模型对地址顺序变化的鲁棒性

MGeo模型对地址顺序变化的鲁棒性 引言&#xff1a;中文地址匹配的现实挑战与MGeo的定位 在中文地址数据处理中&#xff0c;实体对齐是构建高质量地理信息系统的基石任务之一。然而&#xff0c;现实中的地址表达存在高度多样性——同一地点可能因书写习惯、区域规范或录入误差而…

提示词不生效?Z-Image-Turbo CFG参数调优实战技巧

提示词不生效&#xff1f;Z-Image-Turbo CFG参数调优实战技巧 引言&#xff1a;当提示词“失灵”时&#xff0c;问题可能出在CFG上 在使用阿里通义Z-Image-Turbo WebUI进行AI图像生成的过程中&#xff0c;许多用户都曾遇到过这样的困扰&#xff1a;精心撰写的提示词&#xff08…

M2FP自动化拼图功能揭秘:如何将Mask列表转为可视化分割图?

M2FP自动化拼图功能揭秘&#xff1a;如何将Mask列表转为可视化分割图&#xff1f; &#x1f9e9; 多人人体解析服务的技术背景 在计算机视觉领域&#xff0c;语义分割是实现精细化图像理解的核心技术之一。而在实际应用中&#xff0c;多人人体解析&#xff08;Multi-person H…

低成本实现智能美颜:M2FP精准分割面部区域,节省算力80%

低成本实现智能美颜&#xff1a;M2FP精准分割面部区域&#xff0c;节省算力80% 在当前AI视觉应用快速普及的背景下&#xff0c;实时、精准的人体语义分割已成为智能美颜、虚拟试衣、AR互动等场景的核心技术支撑。然而&#xff0c;传统高精度模型往往依赖高端GPU进行推理&#…

从ModelScope加载M2FP:官方模型库直接调用最佳实践

从ModelScope加载M2FP&#xff1a;官方模型库直接调用最佳实践 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) &#x1f4d6; 项目简介 本镜像基于 ModelScope 的 M2FP (Mask2Former-Parsing) 模型构建。 M2FP 是目前业界领先的语义分割算法&#xff0c;专注于多人人体…