如何mock pandas中sample函数返回的采样值以用于单元测试?
Pandas sample 函数单元测试的Mock实现方案
你可以通过mock Series的sample方法,自定义采样返回的数值,完全控制最终的sum计算结果,常见实现方式如下:
1. 基于Python内置unittest框架实现
直接mock业务代码中调用的sample方法,指定返回值即可,示例代码:
import unittest from unittest.mock import patch import pandas as pd # 替换为你实际的业务模块导入路径 from your_module import your_target_func class TestSampleCalculation(unittest.TestCase): def test_sample_sum(self): # 自定义采样返回的数值序列,可按需修改为你想要的测试值 expected_sample_series = pd.Series([2, 4, 6, 8, 10]) # 注意:patch的路径必须为你业务代码中实际调用sample方法的路径 with patch("your_module.Series.sample") as mock_sample_method: mock_sample_method.return_value = expected_sample_series # 调用待测试的业务函数 actual_result = your_target_func() # 校验sample方法是否按预期参数调用 mock_sample_method.assert_called_once_with(35, random_state=111) # 校验最终计算结果,此处预期值为自定义序列的和 2+4+6+8+10=30 self.assertEqual(actual_result, 30)
2. 基于pytest + pytest-mock实现
写法更简洁,示例如下:
import pandas as pd # 替换为你实际的业务模块导入路径 from your_module import your_target_func def test_sample_sum(mocker): expected_sample_series = pd.Series([2, 4, 6, 8, 10]) mock_sample_method = mocker.patch("your_module.Series.sample") mock_sample_method.return_value = expected_sample_series actual_result = your_target_func() mock_sample_method.assert_called_once_with(35, random_state=111) assert actual_result == 30
注意事项
- patch路径必须准确:需要mock的是业务代码中实际调用的sample方法所在路径,不要直接mock pandas官方库的路径,否则无法生效。
- 如果你不想使用mock方案,也可以直接构造固定内容的测试DataFrame,由于你调用sample时指定了固定
random_state=111,采样结果是固定的,提前计算好sum值做断言也可以实现测试,但灵活度低于mock方案。
内容的提问来源于stack exchange,提问作者mdrishan
相关产品推荐
相关产品推荐

