pytest 运行时如何实时显示 print 输出?

pytest 默认捕获 print 输出只在失败时显示。加 -s 参数(--capture=no)即可实时显示所有 print。本文介绍输出捕获机制及相关参数。

最佳实践
pytest 运行时如何实时显示 print 输出?封面

加 -s 参数:pytest -s。pytest 默认捕获 stdout/stderr;logging 有独立捕获和级别机制。-s 关闭全局标准输出捕获,但 fixture 仍可捕获,实时显示也受程序缓冲影响。

基本用法

pytest -s
pytest tests/test_api.py -s -v

-s 是 --capture=no 的简写;capsys/capfd fixture 仍可显式捕获。想同时实时显示与保存 Python 层输出可用 --capture=tee-sys,但它不等于捕获所有底层FD输出。

为什么不显示输出

pytest 的捕获机制(capture)标准输出捕获处理 stdout/stderr,日志插件另行捕获 logging:

  • 好处:测试输出干净,几百个用例跑完只看结果汇总;
  • 失败时:捕获的输出会附在失败报告里,帮助定位问题;
  • 调试时:加 -s 实时看输出。

相关参数

pytest --show-capture=no   # 失败时也不展示捕获的输出
pytest -s                  # 完全不捕获,实时输出
pytest -q                  # 简洁模式,配合 -s 输出更清晰

注意:-s 与 pdb 调试

进入 pdb 调试(breakpoint() 或 --pdb)时 pytest 会自动临时关闭捕获,所以调试时不需要手动加 -s。

常见问题(FAQ)

Q:-s 后 logging 输出也显示吗?
A:print 实时显示;logging 的输出还受 pytest 的 log capture 控制,默认级别 WARNING。想看到 INFO/DEBUG 日志,加 --log-cli-level=INFO。

Q:想看日志但不想关捕获?
A:用 --log-cli-level=DEBUG 开启实时日志输出,print 仍被捕获——两种机制互不影响。

Q:并行(pytest-xdist)时 -s 有效吗?
A:xdist 不支持用 -s 直接透传 worker 标准输出,调试建议先去掉 -n 单进程运行。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台