You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pytest模拟PostgreSQL连接 无需真实数据库测试check_something方法

不连接真实PostgreSQL测试SQLAlchemy方法的方案

完全可以通过Mock实现,不需要连接真实数据库,常用的有两种方案:

方案1:用pytest-mock手动Mock核心对象

无需额外安装除pytest外的第三方库,适合简单场景:

  1. 先安装依赖
pip install pytest pytest-mock
  1. 测试用例示例:
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匹配、结果预置,适合逻辑复杂的查询测试:

  1. 先安装依赖
pip install pytest sqlalchemy-mock
  1. 测试用例示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:15:03