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

Pytest如何测试返回值依赖用户输入的Python函数

pytest测试含input调用函数的实现方法

测试这类依赖用户终端输入的函数,不需要真的手动交互输入,用pytest内置的monkeypatch夹具替换掉Python内置的input方法,模拟输入值/抛出异常,就能覆盖所有逻辑分支。

合法输入返回场景

验证输入属于0-4的合法选项时,函数能正确返回对应整数:

def test_prompt_valid_choice(monkeypatch):
    # 单值测试
    monkeypatch.setattr("builtins.input", lambda _: "1")
    assert prompt() == 1

    # 全量合法值遍历测试
    for valid_opt in ["0", "1", "2", "3", "4"]:
        monkeypatch.setattr("builtins.input", lambda _: valid_opt)
        assert prompt() == int(valid_opt)

非法输入重试场景

验证输入非法值时函数会循环重问,直到收到合法输入才返回:

def test_prompt_retry_on_invalid(monkeypatch):
    # 按顺序返回模拟输入:前两次是非法值,第三次是合法值
    mock_input_sequence = iter(["wrong_input", "7", "4"])
    monkeypatch.setattr("builtins.input", lambda _: next(mock_input_sequence))
    assert prompt() == 4

异常终止场景

验证输入时触发EOFError、KeyboardInterrupt时,函数会按预期退出:

import pytest

def test_prompt_exit_on_eof(monkeypatch):
    def raise_eof(_):
        raise EOFError
    monkeypatch.setattr("builtins.input", raise_eof)
    with pytest.raises(SystemExit) as exit_info:
        prompt()
    assert "Program Terminated." in str(exit_info.value)

def test_prompt_exit_on_keyboard_interrupt(monkeypatch):
    def raise_keyboard_interrupt(_):
        raise KeyboardInterrupt
    monkeypatch.setattr("builtins.input", raise_keyboard_interrupt)
    with pytest.raises(SystemExit) as exit_info:
        prompt()
    assert "Program Terminated." in str(exit_info.value)

注意:自定义的mock input函数必须预留一个位置参数,因为原生input()被调用时会传入提示字符串作为入参,缺少参数会触发运行时报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:48:16