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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:40:38