如何基于Python Unittest实现需输入输出文件函数的全自动化测试?
批量自动化测试方案
核心思路
通过批量匹配测试文件、自动关联预期输出、隔离单个测试用例,实现全自动化的批量测试,无需手动修改硬编码的文件名。
方法一:使用unittest内置的subTest(无需额外依赖)
修改后的测试代码如下:
import unittest from mask import load import io import glob import os class TestInterval(unittest.TestCase): def test_intervals(self): # 匹配所有符合命名规则的测试输入文件(比如test1.txt.gz、test2.txt.gz) input_files = glob.glob("test*.txt.gz") # 测试固定参数 column_name = "PCT" min_percent = 0.85 max_depth = 100 # 临时输出文件路径(也可以按输入文件生成唯一路径避免冲突) temp_output = "test_run.txt" for input_path in input_files: # 从输入文件名自动推导对应的预期输出文件路径 base_filename = os.path.splitext(os.path.splitext(input_path)[0])[0] expected_output = f"{base_filename}_out.txt" # 用subTest隔离每个测试用例,单个用例失败不会中断整体测试,且能明确报错来源 with self.subTest(test_file=input_path): # 执行待测试的load函数 load(column_name, input_path, temp_output, min_percent, max_depth) # 读取预期结果和实际结果并对比 with io.open(expected_output, 'r') as exp_f, io.open(temp_output, 'r') as act_f: self.assertEqual(list(exp_f), list(act_f)) # 可选:删除临时输出文件,避免残留影响后续测试 os.remove(temp_output) if __name__ == '__main__': unittest.main()
方法二:使用parameterized库(更清晰的测试用例展示)
先安装依赖:
pip install parameterized
修改后的测试代码:
import unittest from parameterized import parameterized from mask import load import io import glob import os class TestInterval(unittest.TestCase): # 自动生成测试用例参数:(输入文件路径, 预期输出文件路径) @parameterized.expand([ (file_path, f"{os.path.splitext(os.path.splitext(file_path)[0])[0]}_out.txt") for file_path in glob.glob("test*.txt.gz") ]) def test_interval(self, input_path, expected_output): column_name = "PCT" min_percent = 0.85 max_depth = 100 # 生成与输入文件绑定的临时输出路径,避免多测试用例互相覆盖 temp_output = f"{os.path.splitext(input_path)[0]}_temp.txt" load(column_name, input_path, temp_output, min_percent, max_depth) # 对比结果 with io.open(expected_output, 'r') as exp_f, io.open(temp_output, 'r') as act_f: self.assertEqual(list(exp_f), list(act_f)) # 清理临时文件 os.remove(temp_output) if __name__ == '__main__': unittest.main()
关键注意事项
- 确保测试输入文件和预期输出文件的命名规则统一,比如输入为
testN.txt.gz,预期输出对应testN_out.txt,这样才能自动关联 - 如果不同测试用例需要不同的参数(比如min_percent、column_name),可以把这些参数也加入测试用例的参数列表中
- 使用唯一的临时输出文件名,避免多个测试用例同时运行时互相覆盖结果
内容的提问来源于stack exchange,提问作者Mohadese
相关产品推荐
相关产品推荐

