当前位置: 首页 > news >正文

通过Pytest 多数据库连接实例了解Python工厂模式与单例模式的区别

1. 前言

在做自动化测试时,有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中,一般使用Pytest yaml 数据驱动的居多,如果一个项目中有上百条数据库相关测试用例,在数据库测试时,如果设计不合理的连接模式,可能会导致数据库连接数超长,从而导致连接失败。要如何设计合理的数据库连接管理机制,主要思考两个点:
  1、可以随便切换数据库
  2、连接过的数据库可以不需要再次连接

这里我们使用工厂模式和单例模式来解释这个。

2. 单例模式

单例模式是一种保证一个类只有一个实例的设计模式。在Pytest中,可以利用单例模式确保每种类型的数据库连接只生成一个实例,以便在整个测试过程中共享和复用这些连接对象。

代码示例:

# 写法1
class MySQLConnection:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instancedef connect(self):# 连接到MySQL数据库的具体实现pass# 使用单例模式创建MySQL数据库连接对象
mysql_conn1 = MySQLConnection()
mysql_conn2 = MySQLConnection()print(mysql_conn1 is mysql_conn2)  # 输出:True
mysql_conn1.connect()
# 写法2、利用Python本身就是单实例对象
class MySQLConnection:def connect(self):# 连接到MySQL数据库的具体实现pass# 使用单例模式创建MySQL数据库连接对象
mysql_conn= MySQLConnection()
# 其他文件import 这个实例,也可以实现单实例
import mysql_conn

从上面代码可以看出,单实例就只能有一个实例化,如果我有不同的数据库要连接,这个单实例就适用了。

3. 工厂模式

工厂模式是一种创建对象的设计模式,在Pytest中可以用于根据需要创建不同配置的数据库连接对象。通过工厂模式,可以实现灵活的数据库连接管理,使得测试代码更易于维护和扩展。
代码示例:

class MysqlManagerFactory:""" 使用工厂模式解决多实例连接问题 """instances = {}@classmethoddef get_instance(cls, host, user):key = (host, user)if key not in cls.instances:print(f"New Connect to mysql!")cls.instances[key] = MysqlManager(*key)return cls.instances[key]class MysqlManager(object):def __init__(self, host,user):print(f"Connect to mysql sucess!")passif __name__ == '__main__':db = MysqlManagerFactory.get_instance(1,2)print(db)db1 = MysqlManagerFactory.get_instance(1,2)print(db1)db2 = MysqlManagerFactory.get_instance(2,3)print(db2)

从结果可以看到,第一个实例化话后,第二次连接,不需要再次实例化,如果是其他的配置再次实例化,则会再次重新连接

New Connect to mysql!
Connect to mysql sucess!
<__main__.MysqlManager object at 0x00000298DFCEECD0>
<__main__.MysqlManager object at 0x00000298DFCEECD0>
New Connect to mysql!
Connect to mysql sucess!
<__main__.MysqlManager object at 0x00000298DFCEEFD0>

总结:

单例模式确保每种类型的数据库连接只有一个实例,实现全局共享;而工厂模式则提供了灵活的对象创建机制,使得测试代码更具扩展性和可维护性。如果你想要看到完整的实现案例,可以查看我开源的Pytest 框架源码,这是一个关于如何设计一个适合你自己的简易框架,而不是教你如何用安装包来做接口自动化的CRUD。
https://gitee.com/itestxs/simple-pytest.git

相关文章:

通过Pytest 多数据库连接实例了解Python工厂模式与单例模式的区别

1. 前言 在做自动化测试时&#xff0c;有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中&#xff0c;一般使用Pytest yaml 数据驱动的居多&#xff0c;如果一个项目中有上百条数据库相关测试用例&#xff0c;在数据库测试时&#xff0c;如果设计不合理的连接模…...

超拟人语音合成上线,打造有温度的交互新体验

语言使得人类可以构建共同想象的现实&#xff0c;即共同的信念&#xff0c;从而进行大规模团结合作&#xff0c;这是认知革命赋予人类力量的核心。在《人类简史》中&#xff0c;语言被描述成为人类进化的关键力量&#xff0c;而语音的能力是推动语言逐渐进化的火花。 人工智能…...

word 及PPT 中修改公式字体

主要参考&#xff1a; 1.word修改公式默认字体并打出漂亮公式_word 公式 字体-CSDN博客 2.word 使用数学公式字体 在2中 提供的 链接下载字体&#xff0c;或者可以在这里直接下载&#xff0c;下载链接&#xff1a; https://www.lanzoub.com/iNt3g1rs3w0h 密码:a52p 然后按…...

将数据转换成xml格式的文档并下载

现在有一个实体类对象的集合&#xff0c;需要将它们转换为xml文档&#xff0c;xml文档就是标签集合的嵌套&#xff0c;例如一个学生类&#xff0c;有姓名、年龄等&#xff0c;需要转换成一下效果&#xff1a; <student><age>14</age><name>张三</na…...

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中&#xff0c;AB测试&#xff08;也称为分组测试或随机化对照实验&#xff09;是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组&#xff08;通常是A组和B组&#xff09;&#xff0c;对比不同版本的产品或策略对关键…...

flask之请求钩子

请求钩子是通过装饰器的形式实现&#xff0c;Flask支持如下四种请求钩子&#xff1a; 1、before_first_request: 在第一次请求处理之前先被执行 2、before_request: 在每次请求前执行 3、after_request: 在每次请求处理之后被执行 接受一个参数&#xff1a;视图函数的响应在…...

COPY requires at least two arguments, docker COPY 报错

COPY requires at least two arguments # 使用 Node.js 12.16.0FROM node:12.16.0WORKDIR /appCOPY ..原因&#xff1a;Dockerfile文件COPY后的两个. 要加空格 本内容来源于小豆包&#xff0c;想要更多内容请跳转小豆包 》...

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…...

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

发现有一个会Python的男友魅力值杠杠的!!!

Python能做什么&#xff1f; 可以做日常任务&#xff0c;比如自动备份你的MP3&#xff0c;可以做网站&#xff0c;很多著名的网站像知乎、YouTube就是Python写的&#xff0c; 可以做网络游戏的后台&#xff0c;很多在线游戏的后台都是Python开发的。 上面说的这些本人并没有实…...

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…...

C语言经典面试题目(二十六)

1、解释一下C语言中的函数原型及其作用。 函数原型是指在函数定义之前声明函数的参数类型、返回类型和函数名称的一种声明方式。函数原型的作用包括&#xff1a; 编译器检查&#xff1a;函数原型能够告诉编译器函数的返回类型和参数类型&#xff0c;从而能够在编译阶段检查函…...

创建一个electron-vite项目

前置条件&#xff1a;非常重要&#xff01;&#xff01;&#xff01; npm: npm create quick-start/electronlatest yarn: yarn create quick-start/electron 然后进入目录&#xff0c;下载包文件&#xff0c;运行项目 到以上步骤&#xff0c;你已经成功运行起来一个 electr…...

Codeforces Round 935 (Div. 3)A~E

A. Setting up Camp 题目分析: 有三种人&#xff0c;内向、外向、综合&#xff0c;内向必须独自一个帐篷&#xff0c;外向必须3个人一个帐篷&#xff0c;综合介于1~3人一个帐篷&#xff0c;我们发现非法情况只会存在外向的人凑不成3个人一个帐篷的情况&#xff0c;因外向不够可…...

ES: spring boot中使用ElasticsearchClient

一、依赖&#xff1a;&#xff08;要根据不同版本的ES来调整依赖,否则会报错&#xff0c;不支持太低版本的ES&#xff0c;比如7.6以下的&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-e…...

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…...

使用CUDA 为Tegra构建OpenCV

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 下一篇&#xff1a;在iOS中安装 警告&#xff1a; 本教程可能包含过时的信息。 使用CUDA for Tegra 的OpenCV 本文档是构建支持 CUD…...

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…...

如何在Linux系统部署Dupal CMS结合内网穿透实现无公网IP访问web界面

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&a…...

小巧玲珑的SQLite

SQLite是桌面端和移动端的不错选择 前言 SQLite身影无处不在。 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它的设计目标是嵌入式的&#xff0c;而且目前已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&a…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...