默认用--tb=short可精简堆栈,仅保留测试文件路径、行号、错误类型及本行代码快照;搭配-v可见具体失败函数;还可设为pyproject.toml默认配置。
pytest报错时默认堆栈太长,怎么只看关键行
默认情况下,pytest 报错会打印完整 traceback,包含大量框架内部调用(比如 _pytest/python.py、pluggy 等),真正出问题的测试代码反而被埋在中间。这不是信息多,是噪音多。
用 --tb=short 就能砍掉无关层,只保留:测试文件路径 + 行号 + 错误类型 + 本行代码快照。它不改错误逻辑,只改展示方式。
- 只影响终端输出,不影响日志或 pytest-xdist 分布式执行
- 对
AssertionError、TypeError、KeyError都生效 - 和
-v(详细模式)搭配用效果更明显,能看到具体哪个测试函数挂了
除了 --tb=short,还有哪些 tb 模式可选
--tb 后面其实支持多个值,不是只有 short 实用:
-
--tb=short:推荐日常开发使用,显示测试文件中的出错行 + 上下文 1 行 -
--tb=line:极简,只输出一行,如test_example.py:12: AssertionError,适合 CI 日志里快速 grep -
--tb=none:完全不显示 traceback,只剩FAILED和错误类型,调试时慎用 -
--tb=long(默认):全量堆栈,适合定位 pytest 插件或自定义 hook 的问题
注意:--tb=short 不会隐藏 raise 所在行,但会跳过 pytest 自己的调用帧(比如 runtest、pytest_runtest_makereport)。
为什么有时候 --tb=short 还是看不到关键变量值
短堆栈只精简调用链,不增强错误信息本身。如果断言失败是 assert a == b,而 a 和 b 是复杂对象,--tb=short 依然只显示 AssertionError,不会自动打印变量内容。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
- 想看到变量值,得靠
pytest的内置机制:在断言中直接写明,比如assert a == b, f"a={a!r}, b={b!r}" - 或者装
pytest-asyncio以外的辅助插件(如pytest-print),但它们和--tb无关 - 在 PyCharm 或 VS Code 里跑测试时,图形化断点比任何
--tb参数都管用
把 --tb=short 设成默认,避免每次敲命令
不用每次都加参数。在项目根目录加一个 pyproject.toml 文件即可:
[tool.pytest.ini_options] tb = "short" # 其他常用配置可一起写 addopts = ["-v", "--strict-markers"]
这样所有成员执行 pytest 都自动生效,CI 脚本也不用改。注意:如果本地有 pytest.ini 或 tox.ini,优先级顺序是 pyproject.toml > pytest.ini > tox.ini,别配重了。
真正容易被忽略的是:当测试里用了 try/except 吞掉异常再 raise 新异常时,--tb=short 显示的是新异常的位置,不是原始出错点——这时候得用 raise ... from e 保留因果链,否则再短的 traceback 也救不了。