pytest 运行时如何实时显示 print 输出?
pytest 默认捕获 print 输出只在失败时显示。加 -s 参数(--capture=no)即可实时显示所有 print。本文介绍输出捕获机制及相关参数。
加 -s 参数:pytest -s。pytest 默认捕获所有 print/logging 输出(只在用例失败时展示),-s 关闭捕获,输出实时显示在终端。
基本用法
pytest -s
pytest tests/test_api.py -s -v
-s 是 --capture=no 的简写。
为什么不显示输出
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:有效,但多个 worker 的输出会交错,调试时建议先单进程跑。