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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:20