使用pytest模拟PostgreSQL连接 无需真实数据库测试check_something方法
不连接真实PostgreSQL测试SQLAlchemy方法的方案
完全可以通过Mock实现,不需要连接真实数据库,常用的有两种方案:
方案1:用pytest-mock手动Mock核心对象
无需额外安装除pytest外的第三方库,适合简单场景:
- 先安装依赖
pip install pytest pytest-mock
- 测试用例示例:
import pytest from your_module import check_something # 替换为你实际的模块导入路径 def test_check_something(mocker): # 模拟表的列结构,按你真实表的字段调整即可 mock_col_id = mocker.Mock(name="id") mock_col_name = mocker.Mock(name="name") mock_table = mocker.Mock() mock_table.c = [mock_col_id, mock_col_name] # 模拟数据库连接的执行方法和返回结果 expected_result = [(1, "测试数据1"), (2, "测试数据2")] mock_execute = mocker.Mock(return_value=mocker.Mock(fetchall=lambda: expected_result)) mock_conn = mocker.Mock(execute=mock_execute) # 调用被测方法 actual_result = check_something(mock_conn, mock_table, u_id=123) # 断言结果符合预期,也可校验生成的SQL是否正确 assert actual_result == expected_result # 可选:校验执行的SQL语句 executed_sql = str(mock_execute.call_args[0][0]) assert executed_sql == "SELECT id, name"
方案2:用sqlalchemy-mock库处理复杂场景
专门适配SQLAlchemy的Mock库,支持更方便的SQL匹配、结果预置,适合逻辑复杂的查询测试:
- 先安装依赖
pip install pytest sqlalchemy-mock
- 测试用例示例:
from sqlalchemy_mock import MockConnection, MockTable from your_module import check_something def test_check_something_with_specialized_mock(): # 构造模拟表,和真实表结构保持一致 mock_table = MockTable( name="你的实际表名", columns=["id", "name", "create_time"] ) # 预置对应查询的返回结果 mock_conn = MockConnection() test_data = [(1, "张三", "2024-01-01"), (2, "李四", "2024-01-02")] mock_conn.add_query_result( query="SELECT id, name, create_time FROM 你的实际表名", result=test_data ) # 调用被测方法 result = check_something(mock_conn, mock_table, u_id=1) # 断言结果 assert result == test_data # 可直接校验对应查询是否被调用 assert mock_conn.query_was_called("SELECT id, name, create_time FROM 你的实际表名")
补充替代方案
如果想要更贴近真实数据库的行为做集成测试,又不想搭建PostgreSQL服务,可以用SQLite内存模式:
# 把引擎替换为内存SQLite,不需要真实连接 engine = create_engine("sqlite:///:memory:")
测试前手动在内存库中建表、插入测试数据即可,执行速度快,也不需要外部依赖服务。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

