如何用Pytest的capsys捕获连续多次input()的提示信息?
解决Pytest测试多次input()调用时的提示捕获问题
问题的核心在于:直接用monkeypatch替换input函数时,默认的模拟逻辑没有复现原input函数打印提示信息的行为,导致capsys无法捕获到多次调用的提示内容。
步骤1:明确被测函数示例
假设你的被测函数如下:
def somefun(): while True: user_input = input("请输入字符a: ") if user_input == 'a': return "验证通过"
步骤2:编写正确的测试代码
要同时模拟输入和捕获提示,需要让自定义的mock_input函数复现原input的完整行为:接收提示参数、打印提示、按顺序返回模拟输入。
def test_somefun_multiple_input(monkeypatch, capsys): # 定义模拟输入序列,按调用顺序返回 mock_input_sequence = iter(['b', 'c', 'a']) def mock_input(prompt): # 打印提示信息,匹配原input的行为(不自动换行) print(prompt, end='') # 返回下一个模拟输入值 return next(mock_input_sequence) # 替换系统的input函数 monkeypatch.setattr('builtins.input', mock_input) # 执行被测函数 result = somefun() # 捕获输出内容 captured = capsys.readouterr() # 验证返回值 assert result == "验证通过" # 验证捕获的三次提示信息 assert captured.out == "请输入字符a: 请输入字符a: 请输入字符a: "
关键说明
- 模拟原input的打印行为:原
input(prompt)会将prompt输出到标准输出且不添加换行,因此mock_input中需要用print(prompt, end='')来对齐这个行为。 - 迭代器处理多输入:用
iter()将模拟输入列表转为迭代器,每次调用mock_input时通过next()按顺序返回输入值,完美匹配循环中多次调用input的场景。 - capsys的使用时机:必须在被测函数执行完成后调用
capsys.readouterr(),才能捕获所有输出内容。
内容的提问来源于stack exchange,提问作者Sky V
相关产品推荐
相关产品推荐

