如何使用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
相关产品推荐
相关产品推荐

