Python单元测试:如何将func.py主函数中run参数的维度传入测试脚本
嘿,作为Python单元测试新手,我完全理解你想验证输出维度的需求——这其实是单元测试里非常常见的场景,尤其是处理数据或模型输出的时候。下面是几种实用的方法,帮你把func.py里主函数的run['l_modeloutputs']和run['l_dataoutputs']的维度拿到测试脚本里验证:
方法1:直接调用主函数获取run字典
如果你的主函数可以独立运行(不需要复杂的外部依赖,比如读特定文件、调用第三方API),这是最直接的方式。你只需要在测试脚本里导入主函数,执行它拿到完整的run字典,再提取需要的字段验证维度即可。
举个例子:
假设func.py里的主函数是这样的:
# func.py def main(): # 这里是你的业务逻辑,最终生成run字典 run = { 'l_modeloutputs': your_model_output_array, 'l_dataoutputs': your_data_output_array } return run
那测试脚本(比如命名为test_func.py)可以这么写:
import unittest from func import main class TestOutputDimensions(unittest.TestCase): def test_output_dimensions_match_expected(self): # 调用主函数拿到run字典 run_result = main() # 提取需要验证的输出 model_output = run_result['l_modeloutputs'] data_output = run_result['l_dataoutputs'] # 验证维度是否符合预期,比如假设期望是(100, 20)和(100, 10) self.assertEqual(model_output.shape, (100, 20)) self.assertEqual(data_output.shape, (100, 10)) if __name__ == '__main__': unittest.main()
小贴士:如果主函数需要输入参数,记得传入测试专用的模拟参数,这样能保证每次测试的输入稳定,输出也可预测。
方法2:拆分主函数,隔离可测试的逻辑
如果你的主函数很复杂,包含很多外部依赖(比如读取数据库、调用外部服务),直接调用会让测试变得不稳定。这时候建议把生成l_modeloutputs和l_dataoutputs的核心逻辑拆成独立的小函数,这样测试时可以直接针对这些小函数验证,不用跑完整的主流程。
比如重构func.py:
# func.py def generate_model_outputs(input_data): # 这里只放生成l_modeloutputs的核心逻辑 return model_outputs def generate_data_outputs(input_data): # 这里只放生成l_dataoutputs的核心逻辑 return data_outputs def main(): # 处理外部依赖的部分(比如读文件、调API) input_data = load_external_input() # 调用拆分后的函数生成输出 model_outputs = generate_model_outputs(input_data) data_outputs = generate_data_outputs(input_data) run = { 'l_modeloutputs': model_outputs, 'l_dataoutputs': data_outputs } return run
然后测试脚本就可以直接测试拆分后的函数:
import unittest from func import generate_model_outputs, generate_data_outputs class TestOutputDimensions(unittest.TestCase): def test_model_output_dimension(self): # 构造测试用的输入数据 test_input = ... # 比如numpy数组、列表等适合测试的输入 model_output = generate_model_outputs(test_input) self.assertEqual(model_output.shape, (你的期望维度)) def test_data_output_dimension(self): test_input = ... data_output = generate_data_outputs(test_input) self.assertEqual(data_output.shape, (你的期望维度)) if __name__ == '__main__': unittest.main()
这种方式的好处是测试更聚焦,只验证核心逻辑的输出维度,不受外部依赖的影响。
方法3:用Mock处理外部依赖
如果必须保留主函数的完整流程,但它依赖一些不可控的外部资源(比如数据库、付费API),可以用Python标准库的unittest.mock来模拟这些依赖,让主函数能在测试环境里正常运行,返回我们需要的run字典。
举个例子:假设func.py的main()需要调用load_external_data()获取输入,我们可以mock这个函数:
import unittest from unittest.mock import patch from func import main class TestOutputDimensions(unittest.TestCase): @patch('func.load_external_data') def test_output_dimensions_with_mocked_dependency(self, mock_load_data): # 设置mock函数返回的测试输入 mock_load_data.return_value = 你的模拟输入数据 # 调用主函数,此时它会用mock的输入生成run字典 run_result = main() # 验证维度 self.assertEqual(run_result['l_modeloutputs'].shape, (期望维度)) self.assertEqual(run_result['l_dataoutputs'].shape, (期望维度)) if __name__ == '__main__': unittest.main()
Mock的作用是帮你隔离外部依赖,让测试只关注你关心的输出维度是否正确,不用关心外部资源的状态。
内容的提问来源于stack exchange,提问作者Enzo Bruckmamaan

