如何用 pdb 断点调试 pytest 测试?
调试 pytest 用例有两种方式:在代码里插入 breakpoint() 手动打断点,或用 pytest --pdb 在断言失败时自动进入调试器。本文介绍两种用法及常用 pdb 命令。
两种方式:一是在测试代码里写 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 会自动临时关闭捕获,交互不受影响。