--tb参数可选值有short、line、native、long、full和no:short保留测试模块内关键帧;line仅显示一行摘要;full比long多含局部变量;不支持数字如--tb=5。

pytest --tb参数有哪些可选值及其实际效果
--tb 参数控制 pytest 输出错误回溯(traceback)的详细程度,不是调节“深度”的数值型开关,而是预设的几种模式。常见值有:short、line、native、long、full 和 no。其中 short 会省略中间无关帧,只保留失败点和关键调用;line 只显示一行摘要(如 AssertionError: assert False);full 和 long 都会展开全部帧,但 full 还包含局部变量信息(需配合 -v 或启用 showlocals=True)。误以为能写 --tb=5 这类数字是常见误区——pytest 不支持自定义帧数。
想真正控制回溯帧数?得用 pytest 自定义 hook
原生 --tb 不提供帧数裁剪能力,但可通过 pytest_exception_interact 或 pytest_runtest_makereport hook 实现。最实用的是在 conftest.py 中重写 pytest_exception_interact,用 traceback.format_exception() 手动截取前 N 帧:
import traceback
import sys
<p>def pytest_exception_interact(node, call, report):
if report.failed:
exc_type, exc_value, tb = sys.exc_info()</p><h1>只保留最后 3 层调用帧(含失败行)</h1><pre class='brush:python;toolbar:false;'> limited_tb = traceback.extract_tb(tb)[-3:]
formatted = ''.join(traceback.format_list(limited_tb))
print(f"\n{formatted}{traceback.format_exception_only(exc_type, exc_value)[0]}")
sys.exit(1)</pre>注意:这会绕过 pytest 默认输出,需自行格式化;且 sys.exit(1) 是为演示简洁性,生产环境应抛出异常或调用 report.longrepr 替换。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
--tb=short 为什么有时仍显示太多帧?
--tb=short 的裁剪逻辑依赖于“是否属于测试模块”。它会保留:
- 最内层失败行(如
assert所在行) - 所有位于测试文件(
*_test.py或test_*.py)中的调用帧 - 跳过标准库、site-packages 和非测试模块的中间帧
如果你的工具链里大量使用 conftest.py、fixture 或封装断言函数,这些帧默认会被保留——因为它们属于项目代码路径,不被当作“外部库”。解决办法是:
- 把复用逻辑移入
src/下独立模块,确保路径不含test关键字 - 用
@pytest.mark.tryfirst或autouse=Truefixture 时留意其调用栈位置 - 改用
--tb=line+-v查看简明失败摘要,再按需打开 full 回溯 -
--tb=short -v:显示测试名 + 简洁回溯,适合 CI 日志扫描 -
--tb=short --show-capture=all:捕获并打印print()和日志,定位上下文更准 -
--tb=short -p no:logging:禁用 pytest 内置日志捕获,避免干扰 traceback 格式
结合 -v 和 --show-capture 控制信息密度
单独调大回溯深度意义有限,真正影响调试效率的是输出噪音。推荐组合使用:
特别注意:如果测试中用了 logging.basicConfig() 或第三方日志库,可能污染 traceback 输出顺序——建议统一用 caplog fixture 记录日志,而非直接 print。
立即学习“Python免费学习笔记(深入)”;
回溯长度从来不是孤立参数,它和你的模块结构、fixture 设计、日志策略强耦合。别只盯着 --tb,先理清哪些帧真有必要出现在失败报告里。

















