模拟多个数据库连接?

问题描述 投票:0回答:1

我有一个与许多不同数据库产品集成的Python应用程序; MySQL、MariaDB、PostgreSQL 甚至 GitHub 等一些应用程序。每个集成都是使用相关的 SDK 编写的,例如

mysql-connector-python
psycopg
等。

现在,我为这些集成准备了一些单元测试,使用

unittest
编写。我目前的做法是部署所有这些单独的服务 Docker 容器(如果适用)或使用云产品。

随着时间的推移,这变得相当难以维护,尤其是随着集成数量的增加。

如何简化这个过程?我是否可以“模拟”所有这些不同的数据库/应用程序连接?

python unit-testing mocking python-unittest
1个回答
0
投票

我从未使用过Python连接到MySql、MariaDB或PostgreSQL,但我已经使用了大量Python通过Redis的Python客户端连接到Redis数据库服务器

redis-py

此外,我已经嘲笑了很多与 Redis 数据库的连接。因此,我在这里展示如何使用 Redis 执行此模拟,以便您有一个示例来模拟与其他类型数据库的连接。

我想有以下生产代码,它创建与真实 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数据库中存在的key
    MY_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 只是用于对您的数据库之一执行查询的方法名称的示例。

通过模拟对象返回的值,您可以测试管理返回值的业务代码。

显然这是一个简单的例子,但我希望它可以提出一些建议来解决与许多不同数据库的复杂集成测试。

© www.soinside.com 2019 - 2024. All rights reserved.