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

如何用Pytest测试无返回值的again()函数?CS50P项目求助

测试CS50P项目中的again()函数

为什么直接传参调用again("n")会报错

again()函数定义时没有参数,它是通过内部调用input()获取用户输入的,并非通过函数参数接收输入,所以直接传参必然报错。要测试它,需要模拟用户的输入行为,而非给函数传参。

正确测试方法(基于Pytest)

我们需要用到Pytest的几个核心工具:

  • monkeypatch:替换内置的input()函数,模拟用户输入内容
  • capsys:捕获函数的打印输出
  • pytest.raises():捕获sys.exit()触发的退出异常

假设你的again()函数在main.py文件中,测试文件命名为test_main.py,以下是完整测试代码:

import sys
import pytest
from main import again

def test_again_exit_on_n(monkeypatch):
    # 模拟用户输入'n'
    monkeypatch.setattr("builtins.input", lambda prompt: "n")
    
    # 捕获sys.exit异常,验证退出行为
    with pytest.raises(SystemExit) as excinfo:
        again()
    
    # 验证退出提示信息是否正确
    assert excinfo.value.args[0] == "Good-bye 👋 \n"

def test_again_print_empty_line_on_other_input(monkeypatch, capsys):
    # 模拟用户输入非'n'的内容,比如'y'
    monkeypatch.setattr("builtins.input", lambda prompt: "y")
    
    # 调用函数
    again()
    
    # 捕获打印的输出
    captured = capsys.readouterr()
    
    # 验证是否打印了空行
    assert captured.out == "\n"

代码解释

  1. 测试输入'n'的情况:

    • monkeypatch.setattr("builtins.input", lambda prompt: "n"):把系统默认的input()替换成一个lambda函数,不管收到什么提示语,都返回'n'
    • pytest.raises(SystemExit):用上下文管理器捕获sys.exit()触发的异常,确保函数在输入'n'时确实会执行退出逻辑
    • 最后断言退出时的提示信息和预期一致
  2. 测试输入非'n'的情况:

    • 同样用monkeypatch模拟输入其他值
    • capsys.readouterr():获取函数执行过程中打印的所有内容,captured.out对应标准输出的内容
    • 断言输出是一个空行(即"\n"),验证函数的打印行为符合预期

运行测试

在终端执行pytest test_main.py -v,即可查看两个测试用例的执行结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:37:07