pytest加--pdb可在测试失败时自动进入pdb调试,但仅对未捕获异常(如AssertionError)生效;若异常被try/except吞掉、使用--tb=no、pytest-xdist并行或sys.exit()则失效;推荐通过pyproject.toml固化addopts = ["--pdb"],并注意fixture变量在pdb中可查但临时路径退出后才清理。

pytest命令行加--pdb就能中断调试,但别漏掉关键细节
测试失败时直接进pdb是最常用做法,执行命令时加上--pdb即可:
pytest --pdb test_example.py
它会在第一个失败点自动触发pdb.set_trace()。但注意:这个开关只对AssertionError和未捕获异常生效,不会在print()或logging输出后停住;如果测试里自己吞掉了异常(比如try/except里没raise),--pdb也进不去。
想让每次运行都默认启用--pdb?改pytest.ini或pyproject.toml
避免每次都敲参数,推荐在项目配置文件里固化设置:
- 用
pytest.ini时,在[tool:pytest]节下加addopts = --pdb - 用
pyproject.toml时,写成:[tool.pytest.ini_options]<br>addopts = ["--pdb"]
- 注意:如果同时存在多个配置文件,
pyproject.toml优先级高于pytest.ini,旧配置可能被忽略 -
--pdb和--pdbcls=IPython.terminal.debugger:TerminalPdb可以组合使用,换成IPython调试器体验更好(需先pip install ipython)
--pdb进不去?检查是否被--tb或pytest_plugins干扰
常见静默失效场景:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 命令里显式加了
--tb=no或--tb=short,会抑制--pdb触发(因为pdb依赖traceback信息) - 某些插件如
pytest-xdist默认禁用--pdb(多进程下pdb不可用),此时必须加-n0关掉并行才能用 - 测试函数里用了
os._exit()或sys.exit(),会绕过pytest异常捕获机制,--pdb完全不生效 - 自定义的
pytest_exception_interact钩子函数如果返回了True,也会跳过pdb
只想对特定测试启用pdb?用-k或@pytest.mark.pdb精准控制
全局开--pdb太吵,可按需激活:
- 按名称过滤:
pytest --pdb -k "test_login_failure"
- 用标记(需先注册):在
conftest.py里加def pytest_configure(config):<br> config.addinivalue_line("markers", "pdb: run with pdb on failure")然后在测试上写@pytest.mark.pdb,再运行pytest -m pdb - 更轻量的方式是临时加
import pdb; pdb.set_trace()在可疑行,比依赖--pdb更可控
真正容易被忽略的是:pdb进入后,当前帧的局部变量、self、request fixture全都能直接查,但pytest的fixture生命周期管理会让某些对象(比如tmp_path)在pdb退出后才清理——别在pdb里手动删临时文件,可能引发后续测试失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










