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

本文介绍了在自动化测试中如何通过单例模式确保每个数据库连接的唯一实例,以及如何使用工厂模式动态创建不同配置的数据库连接,以避免连接数过多导致的问题。作者还提供了实际代码示例和开源框架链接以供参考。
摘要由CSDN通过智能技术生成

1. 前言

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

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

2. 单例模式

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

代码示例:

# 写法1
class MySQLConnection:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def 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 = {}

    @classmethod
    def 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!")
        pass

if __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

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在进行unittest测试时,有时我们需要模拟数据库连接来进行测试,而不是使用实际的数据库。引用\[1\]提到了一种方法,即使用模拟包的补丁功能来修补测试数据库到生产数据库。这可以通过Python标准库的unittest.mock模块来实现。在引用\[2\]的执行测试函数结果,我们可以看到测试会话的开始和结束,以及测试结果的统计信息。这个例子展示了一个测试函数通过模拟数据库连接成功执行的情况。引用\[3\]提到,这个教程旨在为用户提供使用模拟数据库进行unittest测试的基础知识,具体的实现方法可能会因使用的ORM等因素而有所不同。 #### 引用[.reference_title] - *1* *3* [python模拟数据库_使用模拟数据库进行Python测试](https://blog.csdn.net/weixin_26752759/article/details/108130659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Pytest 自动化测试框架](https://blog.csdn.net/HUA1211/article/details/129468714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值