通过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. 前言 在做自动化测试时,有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中,一般使用Pytest yaml 数据驱动的居多,如果一个项目中有上百条数据库相关测试用例,在数据库测试时,如果设计不合理的连接模…...

超拟人语音合成上线,打造有温度的交互新体验
语言使得人类可以构建共同想象的现实,即共同的信念,从而进行大规模团结合作,这是认知革命赋予人类力量的核心。在《人类简史》中,语言被描述成为人类进化的关键力量,而语音的能力是推动语言逐渐进化的火花。 人工智能…...
word 及PPT 中修改公式字体
主要参考: 1.word修改公式默认字体并打出漂亮公式_word 公式 字体-CSDN博客 2.word 使用数学公式字体 在2中 提供的 链接下载字体,或者可以在这里直接下载,下载链接: https://www.lanzoub.com/iNt3g1rs3w0h 密码:a52p 然后按…...

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

深入理解与实践AB测试:从理论到实战案例解析
一、引言 在互联网产品优化和运营策略制定中,AB测试(也称为分组测试或随机化对照实验)是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组(通常是A组和B组),对比不同版本的产品或策略对关键…...
flask之请求钩子
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子: 1、before_first_request: 在第一次请求处理之前先被执行 2、before_request: 在每次请求前执行 3、after_request: 在每次请求处理之后被执行 接受一个参数:视图函数的响应在…...
COPY requires at least two arguments, docker COPY 报错
COPY requires at least two arguments # 使用 Node.js 12.16.0FROM node:12.16.0WORKDIR /appCOPY ..原因:Dockerfile文件COPY后的两个. 要加空格 本内容来源于小豆包,想要更多内容请跳转小豆包 》...

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移
知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…...

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...

发现有一个会Python的男友魅力值杠杠的!!!
Python能做什么? 可以做日常任务,比如自动备份你的MP3,可以做网站,很多著名的网站像知乎、YouTube就是Python写的, 可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。 上面说的这些本人并没有实…...

SQL日期函数
文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数(天)3.4 相差时间&…...
C语言经典面试题目(二十六)
1、解释一下C语言中的函数原型及其作用。 函数原型是指在函数定义之前声明函数的参数类型、返回类型和函数名称的一种声明方式。函数原型的作用包括: 编译器检查:函数原型能够告诉编译器函数的返回类型和参数类型,从而能够在编译阶段检查函…...

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

Codeforces Round 935 (Div. 3)A~E
A. Setting up Camp 题目分析: 有三种人,内向、外向、综合,内向必须独自一个帐篷,外向必须3个人一个帐篷,综合介于1~3人一个帐篷,我们发现非法情况只会存在外向的人凑不成3个人一个帐篷的情况,因外向不够可…...
ES: spring boot中使用ElasticsearchClient
一、依赖:(要根据不同版本的ES来调整依赖,否则会报错,不支持太低版本的ES,比如7.6以下的) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-e…...

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

使用CUDA 为Tegra构建OpenCV
返回:OpenCV系列文章目录(持续更新中......) 上一篇:MultiArch与Ubuntu/Debian 的交叉编译 下一篇:在iOS中安装 警告: 本教程可能包含过时的信息。 使用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 公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&a…...
小巧玲珑的SQLite
SQLite是桌面端和移动端的不错选择 前言 SQLite身影无处不在。 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低&a…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...