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

如何正确测试调用pandas.read_sql的PySpark自定义read_data函数

测试方案设计

我们的测试目标是验证read_data函数的两个核心逻辑,不需要真实连接数据库、启动Spark集群,完全通过mock依赖实现单元测试,运行速度更快且不受外部依赖影响:

  • 验证pandas.read_sql使用了预期的SQL语句、数据库连接参数执行查询
  • 验证read_sql返回的pandas DataFrame被正确传入spark.createDataFrame,且函数返回值就是createDataFrame生成的Spark DataFrame
完整测试代码及断言说明
import pandas as pd
from unittest import mock
# 此处替换为你自己的函数导入路径
from your_module import read_data, conn

# 注意patch路径要匹配read_data函数所在模块引用pd.read_sql的路径,不可直接patch全局pandas.read_sql
@mock.patch("your_module.pd.read_sql")
@mock.patch("pyspark.sql.SparkSession", autospec=True)
def test_read_data(spark_session, pandas_read_sql):
    # 构造mock返回值:模拟pandas.read_sql返回的测试DataFrame
    mock_pd_df = pd.DataFrame({"id": [1,2,3], "value": ["test1", "test2", "test3"]})
    pandas_read_sql.return_value = mock_pd_df

    # 构造mock返回值:模拟spark.createDataFrame返回的Spark DataFrame
    mock_spark_df = mock.Mock()
    spark_session.createDataFrame.return_value = mock_spark_df

    # 执行测试函数
    result = read_data(spark_session)

    # 断言1:验证pandas.read_sql调用参数符合预期
    pandas_read_sql.assert_called_once_with("SELECT * FROM table", conn)
    # 如果无法导入全局conn,也可以只校验SQL参数:
    # assert pandas_read_sql.call_args.args[0] == "SELECT * FROM table"

    # 断言2:验证spark.createDataFrame被传入了read_sql返回的pandas DataFrame
    spark_session.createDataFrame.assert_called_once_with(mock_pd_df)

    # 断言3:验证函数返回值和预期一致
    assert result == mock_spark_df

补充说明:如果你的函数逻辑后续有修改,比如SQL改为动态拼接、转换逻辑新增字段处理,只需要对应调整mock入参和断言逻辑即可。

内容的提问来源于stack exchange,提问作者james pow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:45:06