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

如何用Mock单元测试创建返回PySpark DataFrame的代码?测试失败排查

你的测试代码主要有这几个问题

1. createDataFrame调用参数断言不匹配

原业务代码的get_data方法里,调用spark.createDataFrame(data)时传入的是单个字典{"Name": self.name, "Count": count},但你测试里写的断言是assert_called_once_with([expected_data])——把字典包在列表里了,两者参数完全不一致,这会直接导致断言失败。

2. 原业务代码存在冗余(顺带说明)

你原代码里ctrl_data = spark.createDataFrame(data)这行生成的DataFrame根本没被使用,方法直接返回了原始的data字典,所以result == expected_data这个断言是能通过的,但Spark调用相关的断言会因为参数错误失败。

3. Mock写法可优化(可选)

你直接给SparkSession.builder.getOrCreate赋值Mock的方式虽然能运行,但用unittest.mock.patch来模拟更稳妥,不会污染全局的SparkSession状态,比如用上下文管理器包裹模拟逻辑。

修正后的测试代码示例

from unittest.mock import MagicMock, patch
from get_data import Extract

def test_get_data():
    name = "John Doe"
    extract = Extract(NAME=name)
    count = 10
    expected_data = {"Name": name, "Count": count}

    # 用patch模拟SparkSession的获取逻辑
    with patch('get_data.SparkSession.builder.getOrCreate') as mock_get_session:
        spark_mock = MagicMock()
        mock_get_session.return_value = spark_mock

        result = extract.get_data(count)

        # 验证返回值符合预期
        assert result == expected_data
        # 验证SparkSession获取操作被调用一次
        mock_get_session.assert_called_once()
        # 验证createDataFrame的调用参数和原代码一致(单个字典)
        spark_mock.createDataFrame.assert_called_once_with(expected_data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:01:21