非常游戏网
Python如何快速定位pytest报错的代码行_利用--tb=short缩短堆栈信息

Python如何快速定位pytest报错的代码行_利用--tb=short缩短堆栈信息

2026-05-26日常编程291442

默认用--tb=short可精简堆栈,仅保留测试文件路径、行号、错误类型及本行代码快照;搭配-v可见具体失败函数;还可设为pyproject.toml默认配置。

pytest报错时默认堆栈太长,怎么只看关键行

默认情况下,pytest 报错会打印完整 traceback,包含大量框架内部调用(比如 _pytest/python.pypluggy 等),真正出问题的测试代码反而被埋在中间。这不是信息多,是噪音多。

--tb=short 就能砍掉无关层,只保留:测试文件路径 + 行号 + 错误类型 + 本行代码快照。它不改错误逻辑,只改展示方式。

  • 只影响终端输出,不影响日志或 pytest-xdist 分布式执行
  • AssertionErrorTypeErrorKeyError 都生效
  • -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 自己的调用帧(比如 runtestpytest_runtest_makereport)。

为什么有时候 --tb=short 还是看不到关键变量值

短堆栈只精简调用链,不增强错误信息本身。如果断言失败是 assert a == b,而 ab 是复杂对象,--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.initox.ini,优先级顺序是 pyproject.toml > pytest.ini > tox.ini,别配重了。

真正容易被忽略的是:当测试里用了 try/except 吞掉异常再 raise 新异常时,--tb=short 显示的是新异常的位置,不是原始出错点——这时候得用 raise ... from e 保留因果链,否则再短的 traceback 也救不了。