赞
踩
在做自动化测试时,有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中,一般使用Pytest yaml 数据驱动的居多,如果一个项目中有上百条数据库相关测试用例,在数据库测试时,如果设计不合理的连接模式,可能会导致数据库连接数超长,从而导致连接失败。要如何设计合理的数据库连接管理机制,主要思考两个点:
1、可以随便切换数据库
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
从上面代码可以看出,单实例就只能有一个实例化,如果我有不同的数据库要连接,这个单实例就适用了。
工厂模式是一种创建对象的设计模式,在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。