我有一个与许多不同数据库产品集成的Python应用程序; MySQL、MariaDB、PostgreSQL 甚至 GitHub 等一些应用程序。每个集成都是使用相关的 SDK 编写的,例如
mysql-connector-python
、psycopg
等。
现在,我为这些集成准备了一些单元测试,使用
unittest
编写。我目前的做法是部署所有这些单独的服务 Docker 容器(如果适用)或使用云产品。
随着时间的推移,这变得相当难以维护,尤其是随着集成数量的增加。
如何简化这个过程?我是否可以“模拟”所有这些不同的数据库/应用程序连接?
我从未使用过Python连接到MySql、MariaDB或PostgreSQL,但我已经使用了大量Python通过Redis的Python客户端连接到Redis数据库服务器
redis-py
。我想有以下生产代码,它创建与真实 Redis 服务器的真实连接并从中获取数据(这与在 MySQL 数据库上执行 SQL SELECT 相同):
from redis import Redis
redis_client = Redis(host="127.0.0.1", port=6379, encoding = "utf-8", decode_responses=True)
value = redis_client.get('MY_KEY')
print(value)
redis_client
的 Redis
实例,已创建与 Redis 服务器的真实连接,该连接正在等待 IP 地址 127.0.0.1
(本地主机)和端口 6379
上的连接。redis_client.get('MY_KEY')
获取Redis数据库中存在的keyMY_KEY
的真实值(Redis是一个键值数据库)现在我向您展示一个测试代码示例,该示例模拟真实连接并模拟从服务器恢复键值(这与模拟在 SQL 数据库如 MySQL 中执行 SQL SELECT 指令相同) 要模拟此实例和
get
指令,您可以使用以下代码(将代码存储在名为 test_redis.py 的文件中):
import unittest
import unittest.mock as mock
mock_redis_cli = mock.Mock()
mock_redis_cli.get.return_value = "My mock value of MY_KEY"
value = mock_redis_cli.get('MY_KEY')
print(value)
如果您通过以下方式执行代码:
python test_redis.py
你得到输出:
My mock value of MY_KEY
无需安装任何 Redis 服务器等,无需通过 Python 应用程序创建任何实际连接。
在您的情况下,您可以模拟 SQL 查询返回的值:
示例: mock_mysql_cli.execute_query.return_value = "something",其中 execute_query 只是用于对您的数据库之一执行查询的方法名称的示例。
通过模拟对象返回的值,您可以测试管理返回值的业务代码。
显然这是一个简单的例子,但我希望它可以提出一些建议来解决与许多不同数据库的复杂集成测试。