pytest默认不显示print输出是因为它默认捕获stdout/stderr,仅在失败或加-s时透出;三种推荐方式:①pytest -s本地快速验证;②pytest -v --capture=no提升可读性;③配置pytest.ini中capture=sys实现一劳永逸;长期应改用logging并配--log-cli-level与capture=sys协同生效。

pytest默认不显示print输出,为什么?
因为pytest默认捕获stdout和stderr,测试通过时直接丢弃,只在失败或用-s时才透出。这不是bug,是设计:避免干扰测试结果的纯文本流。但调试时看不到print()就抓瞎。
让pytest显示print日志的三种方式
按推荐顺序列,兼顾可读性、复用性和CI友好性:
- 加
-s参数运行:pytest -s test_example.py——最简单,适合本地快速验证,但会混入所有输出,失败时难定位 - 加
-v+--capture=no(等价于-s):pytest -v --capture=no,-v让输出带测试名,比纯-s更清晰 - 配置
pytest.ini文件,一劳永逸:[tool:pytest] capture = sys
(注意:不是no,sys表示捕获到sys.stdout/sys.stderr但允许log输出;若真要完全不捕获,写capture = no)
用logging替代print才是长期解法
print()在测试里临时凑合还行,但一旦涉及多模块、异步、或需要分级(debug/info/warn)、重定向到文件,就撑不住了。pytest原生支持logging,且能控制级别和格式。
- 测试中用
logging.info("xxx"),而非print("xxx") - 启用log输出需加参数:
pytest -s -v --log-cli-level=INFO(-s仍需保留,否则log被静默捕获) - 想默认生效?在
pytest.ini里加[tool:pytest] log_cli = true log_cli_level = INFO log_cli_format = %(asctime)s [%(levelname)8s] %(name)s: %(message)s
- 注意:
logging默认等级是WARNING,不设--log-cli-level就看不到INFO以下日志
常见踩坑点:--capture和--log-cli-level组合失效
现象:加了--log-cli-level=DEBUG却没看到log。大概率是--capture没关或设错了。
-
--capture有三个值:fd(默认,最严格)、sys(推荐,兼容logging)、no(全放开) - 用
logging时,必须确保--capture不是fd——因为fd会劫持底层文件描述符,log handler可能被绕过 - CI环境别硬写
--capture=no,改用--capture=sys更稳妥,既保log又不炸管道 - 如果用了
caplogfixture做断言,--capture设成no会导致caplog捕不到日志——这是pytest机制限制,不是bug
--capture)和日志通道(logging)得对上号,错一个就白配。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











