如何用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"
代码解释
测试输入'n'的情况:
monkeypatch.setattr("builtins.input", lambda prompt: "n"):把系统默认的input()替换成一个lambda函数,不管收到什么提示语,都返回'n'pytest.raises(SystemExit):用上下文管理器捕获sys.exit()触发的异常,确保函数在输入'n'时确实会执行退出逻辑- 最后断言退出时的提示信息和预期一致
测试输入非'n'的情况:
- 同样用monkeypatch模拟输入其他值
capsys.readouterr():获取函数执行过程中打印的所有内容,captured.out对应标准输出的内容- 断言输出是一个空行(即
"\n"),验证函数的打印行为符合预期
运行测试
在终端执行pytest test_main.py -v,即可查看两个测试用例的执行结果。
内容的提问来源于stack exchange,提问作者Schlossie
相关产品推荐
相关产品推荐

