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

如何使用unittest测试包含input()调用的Python函数

标准实现方案

这类场景的标准实现逻辑就是组合使用 unittest.mock.patch 模拟input()的输入,配合contextlib.redirect_stdout捕获print()的标准输出,你原来的思路是对的,只是存在冗余代码和逻辑遗漏,以下是修正后的标准写法:

from contextlib import redirect_stdout
from io import StringIO
from unittest import TestCase
from unittest.mock import patch
from suffix import *  # 后续批量测试时可替换为动态导入逻辑

class TestModule(TestCase):
    def test_reader_output(self):
        # 读取输入输出测试数据
        with open('input_suffix.txt', 'r', encoding='utf-8') as f:
            input_lines = [line.rstrip('\n') for line in f]
        with open('output_suffix.txt', 'r', encoding='utf-8') as f:
            expected_lines = [line.rstrip('\n') for line in f]

        output_buf = StringIO()
        # 同时完成input模拟和stdout捕获
        with patch('builtins.input', side_effect=input_lines), redirect_stdout(output_buf):
            reader()

        # 处理捕获到的输出,按行拆分
        actual_lines = output_buf.getvalue().splitlines()
        # 逐行对比结果
        for case_no, (actual, expected) in enumerate(zip(actual_lines, expected_lines), start=1):
            self.assertEqual(actual, expected, msg=f"用例{case_no}执行失败")
            print(f"用例{case_no}执行通过")

批量适配上百个模块的优化方案

如果要一次性处理所有同类模块,不需要为每个模块单独编写测试代码,可以通过动态导入实现批量执行:

  • 遍历目录下所有input_*.txt文件,从文件名中提取对应模块的suffix
  • 用importlib.import_module(suffix)动态导入对应后缀的模块
  • 对每个导入的模块复用上述测试逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:57:03