如何使用Pytest的caplog验证用户提示信息?
解决用caplog测试用户提示的问题
为什么caplog抓不到用户提示?
caplog是pytest专门用来捕获logging模块输出的日志(比如logging.warning、logging.error这类),如果你的用户提示是用print()直接输出到标准输出(stdout)的,不属于日志系统的内容,所以caplog根本捕获不到,自然是空的。
两种可行解决方案
方案1:用pytest的capsys/capfd捕获标准输出
pytest提供了capsys和capfd fixture,专门用来捕获程序的标准输出和标准错误,适合测试print()输出的提示信息。
修改你的测试代码如下:
def test_select_org_exact_prompt(atconn, monkeypatch, capsys): monkeypatch.setattr("builtins.input", lambda x: "1") # 选择第一个组织 atconn.select_org() assert atconn.organization == "default" # 捕获标准输出内容 captured_out, captured_err = capsys.readouterr() # 断言提示信息存在于输出中 assert "Please choose an organization:" in captured_out
方案2:修改函数,将提示信息加入日志系统
如果想继续用caplog,可以修改你的select_org函数,把用户提示用logging模块输出(比如logging.info),同时在测试中调整日志级别让caplog能捕获到:
第一步:修改select_org函数
import logging class YourATConnClass: def select_org(self): # 把原来的print提示改成日志输出 logging.info("Please choose an organization:") # 后续的输入逻辑不变 user_choice = input(...) # 其他处理代码...
第二步:修改测试代码
def test_select_org_exact_prompt(atconn, monkeypatch, caplog): # 设置caplog捕获INFO级别及以上的日志 caplog.set_level(logging.INFO) monkeypatch.setattr("builtins.input", lambda x: "1") atconn.select_org() assert atconn.organization == "default" # 检查捕获的日志中是否包含目标提示 assert any("Please choose an organization:" in rec.message for rec in caplog.records)
内容的提问来源于stack exchange,提问作者MikeyCrystal
相关产品推荐
相关产品推荐

