python - 分割 pytest 的 conftest.py 文件

解决 pytest 的 conftest.py 文件过大问题。

1. 项目目录结构

project_name
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── project_name
│   ├── __init__.py
│   ├── testing
│   │   ├── __init__.py
│   │   ├── fixture.py
├── tests
│   ├── __init__.py
│   ├── conftest.py
│   ├── fixtures
│   │   ├── __init__.py
│   │   ├── cache.py
│   │   ├── loop.py
│   │   ├── net.py
│   │   ├── request.py
│   │   ├── signal.py
│   │   └── thread.py

2. 使用 pytest_plugins 加载 fixture

conftest.py 中添加 pytest_plugins 配置,使用 append_pytest_fixture_plugins方法加载 fixtures 目录中的 fixturefixtures 目录下的子目录也会一起加载。

from pathlib import Pathfrom project_name.testing.fixture import append_pytest_fixture_pluginspath = Path(__file__).parent / "fixtures"
root_path = Path(__file__).parent.parent
pytest_plugins = append_pytest_fixture_plugins(root_path, path)

通过这种方式,可以将 conftest.py 中的 fixtures 拆分到多个文件中,方便维护和管理。拆分的文件如下,

│   ├── fixtures
│   │   ├── __init__.py
│   │   ├── cache.py
│   │   ├── loop.py
│   │   ├── net.py
│   │   ├── request.py
│   │   ├── signal.py
│   │   └── thread.py

3. append_pytest_fixture_plugins 函数实现

from pathlib import Path
from typing import Listimport pytestdef append_pytest_fixture_plugins(root_path: Path, path: Path) -> List[str]:"""添加额外的 fixtures"""def refactor(_path: str) -> str:return _path.strip("/").strip("\\").replace("/", ".").replace("\\", ".").replace(".py", "")paths = []prefix = str(root_path)prefix_len = len(prefix)# 递归遍历目录下所有文件for path in path.iterdir():if not path.is_file():continuefilename = path.name# 去掉 __init_.pyif filename.startswith("__"):continue# 过滤掉非 python 文件if filename.endswith(".py"):paths.append(refactor(str(path)[prefix_len:]))return paths

单元测试如下

from pathlib import Pathfrom project_name.testing.fixture import append_pytest_fixture_pluginsdef test_append_pytest_fixture_plugins():path = Path(__file__).parent / "fixtures"root_path = Path(__file__).parent.parentactual = append_pytest_fixture_plugins(root_path, path)expect = ["tests.fixtures.thread","tests.fixtures.signal","tests.fixtures.net","tests.fixtures.request","tests.fixtures.cache","tests.fixtures.loop",]assert actual == expect

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

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

相关文章

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中,处理高频事件的优化至关重要,直接影响用户体验和应用性能。防抖(Debounce)和节流(Throttle)是两种常用且有效的方法,可以控制事件触发频率,减少不必要的资源消耗。如何在…

SEO优化,小白程序员如何做SEO优化流量从0到1

原文链接:SEO优化,小白程序员如何做SEO优化流量从0到1 1、SEO是什么? SEO即:搜索引擎优化(Search Engine Optimization),是一种通过优化网站结构、内容和外部链接等因素,提高网站在搜索引擎中的自然排名&…

python爱心树表白代码

以下是一个使用Python的turtle模块来绘制一颗爱心并表白的简单示例代码: import turtle import math # 设置屏幕 screen turtle.Screen() screen.bgcolor("black") # 绘制爱心 def draw_heart(t, size): t.speed(9) t.penup() t.goto(0, -size…

Python Minio 工具类封装

最近因为需要对大规模的文件进行存储,选了多种对象存储方案,最终选择了MinIO,为了方便python的调用,在minio第三方包的基础上进行进一步封装调用,该工具除了基础的功能外,还封装了多线程分片下载文件和上传…

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。 原文链接:CUDA编程-03:线程层级 DeepDriving | CUDA编程-01: 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02: 初识CUDA编程-C…

Linux之共享内存mmap用法实例(六十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

外卖霸王餐返利外卖会员卡小程序开发

外卖霸王餐返利外卖会员卡小程序开发 "社交电商赋能下的外卖返利小程序"是专为商家与用户双赢而设计的创新平台。 以下是其开发方案的详细步骤: 一、需求梳理:首先,我们需要明确小程序的核心功能和特色。包括设定活动类型、返利…

Python学习(3) 函数

定义 定义一个函数的格式: def 函数名(参数):执行代码如果没有参数,则称为无参函数。 定义时小括号中写的是形参(形式参数),调用时写的是实参(实际参数)。 调用 调用格式: def…

【Docker】Linux 系统(CentOS 7)安装 Docker

文章目录 对 VMware 软件的建议官方说明文档Docker安装卸载旧版本docker设置仓库开始安装 docker 引擎最新版 Docker 安装指定版本 Docker 安装(特殊需求使用) 启动 Docker查看 Docker 版本查看 Docker 镜像设置 Docker 开机自启动 验证开机启动是否生效…

自定义原生小程序顶部及获取胶囊信息

需求:我需要将某个文字或者按钮放置在小程序顶部位置 思路:根据获取到的顶部信息来定义我需要放的这个元素样式 * 这里我是定义某个指定页面 json:给指定页面的json中添加自定义设置 "navigationStyle": "custom" JS&am…

新时代AI浪潮下,程序员和产品经理如何入局AIGC领域?

当下,AI浪潮席卷全球,AIGC大模型技术已经成为当今技术领域的一个重要趋势,对于产品经理来说,掌握这项技术不仅能够增强他们的职业技能,还能在竞争激烈的职场中脱颖而出。 为什么呢? 把握AI时代的机遇 AI技…

StringMVC

目录 一,MVC定义 二,SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…

怎么通过OpenAI API调用其多模态大模型(GPT-4o)

现在只要有额度,大家都可以调用OpenAI的多模态大模型了,例如GPT-4o和GPT-4 Turbo,我一年多前总结过一些OpenAI API的用法,发现现在稍微更新了一下。主要参考了这里:https://platform.openai.com/docs/guides/vision 其…

python数据类型之元组、集合和字典

目录 0.三者主要作用 1.元组 元组特点 创建元组 元组解包 可变和不可变元素元组 2.集合 集合特点 创建集合 集合元素要求 集合方法 访问与修改 子集和超集 相等性判断 集合运算 不可变集合 3.字典 字典特点 字典创建和常见操作 字典内置方法 pprin模块 0.…

k8s——Pod详解

一、Pod基础概念 1.1 Pod定义 Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行…

缪尔赛思又来到了你的面前(哈希)

定义一棵根节点为 1 1 1, n ( 2 ≤ n ≤ 1 0 3 ) n(2≤n≤10^3) n(2≤n≤103) 个节点的树的哈希值为: H ∑ i 1 n X i Y f a ( i ) m o d 998244353 H∑^n_{i1}X^iY^{fa(i)}\ mod\ 998244353 Hi1∑n​XiYfa(i) mod 998244353 f a ( i ) fa(i) fa(i)…

断网之后的页面,Autox.js是点击还是上下滑动比较好?

在处理断网之后的页面,选择点击还是上下滑动作为刷新操作,取决于应用的设计和用户界面。通常,这两种操作都可以作为刷新页面的方式,但它们各自有不同的适用场景: 点击刷新 - 适用场景:如果应用提供了一个明…

Java进阶学习笔记7——权限修饰符

什么是权限修饰符? 就是用来限制类中的成员(成员变量、成员方法、构造器、代码块....)能够被访问的范围。 protected使用的比较少,但是程序员还是要阅读代码,看官方文档是怎么写的,都会接触到protected修饰…

C#串口通信-串口相关参数介绍

串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种双向通讯方式。 串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的通信协议&#xff0c…

ssh 配置 authorized_keys 后无法免密登录

查看日志: tail -f /var/log/auth.log May 25 15:55:13 121 sudo: pam_unix(sudo:session): session opened for user root by root(uid0) May 25 15:55:13 121 sshd[550561]: Received signal 15; terminating. May 25 15:55:13 121 sshd[922866]: Server liste…