如何用 pdb 断点调试 pytest 测试?

调试 pytest 用例有两种方式:在代码里插入 breakpoint() 手动打断点,或用 pytest --pdb 在断言失败时自动进入调试器。本文介绍两种用法及常用 pdb 命令。

最佳实践
如何用 pdb 断点调试 pytest 测试?封面

两种方式:一是在测试代码里写 breakpoint()(或老式写法 import pdb; pdb.set_trace())手动设断点;二是运行 pytest --pdb,让 pytest 在用例失败时自动跳进 pdb 交互调试器。

手动打断点

def test_zero_division():
    breakpoint()   # Python 3.7+ 内置函数
    with pytest.raises(ZeroDivisionError):
        divide(9, 0)

运行 pytest test_exception.py,执行到 breakpoint() 会停下进入 (Pdb) 提示符,pytest 会自动关闭输出捕获以便交互。

失败时自动进入调试器

pytest test_exception.py --pdb

任何用例失败(断言错误或异常)都会在出错点进入 pdb,方便现场检查变量值。

常用 pdb 命令

命令 作用
l (list) 显示当前位置附近的代码
n (next) 执行下一行(不进入函数)
s (step) 单步进入函数
c (continue) 继续执行到下一个断点
p 变量名 打印变量值
q 退出调试器

常见问题(FAQ)

Q:breakpoint() 和 pdb.set_trace() 有区别吗?
A:功能等价。breakpoint() 是 Python 3.7 引入的内置函数,更简洁,还 respects PYTHONBREAKPOINT 环境变量(设为 0 可全局禁用断点)。

Q:pytest 的 -x 和 --pdb 能一起用吗?
A:可以,-x --pdb 表示"第一个失败就停,并进入调试器",是定位问题的常用组合。

Q:调试时想看 pytest 捕获的 print 输出怎么办?
A:加 -s 参数关闭输出捕获;进入 pdb 后 pytest 会自动临时关闭捕获,交互不受影响。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台