调试单元测试卡死清单 | AI生成和翻译

Home 2025.09

unittest 中的卡顿通常源于死锁(线程/异步)、I/O 阻塞、子进程/多进程问题,或测试在等待网络调用。以下是一份精要排查清单,用于定位卡顿位置解决问题——适用于 Python 3.9–3.11。

1) 以详细模式运行 unittest(并确保正确执行)

# 若 xx.py 调用了 unittest.main()
python xx.py -v

# 或使用发现模式(推荐)
python -m unittest -v
python -m unittest discover -v -s tests -p "test_*.py"

注意:python -v解释器导入详细模式,而非测试详细模式。需使用 -m unittest -v 查看测试名称和进度。

2) 启用故障处理程序 + 开发模式(卡顿时输出堆栈转储,强化警告)

# 一次性执行
python -X faulthandler -X dev -u -m unittest -v
# 或通过环境变量
export PYTHONFAULTHANDLER=1
python -X dev -u -m unittest -v

3) 在疑似卡顿时强制获取跟踪信息

方案 A —— 在另一终端执行(Linux/macOS):

kill -SIGUSR1 <进程号>  # 启用故障处理程序后,会输出所有线程堆栈

方案 B —— 在测试启动代码中添加(置于 xx.py 顶部):

import faulthandler, signal, sys
faulthandler.enable()
# 收到 SIGUSR1 信号时输出堆栈:
faulthandler.register(signal.SIGUSR1, all_threads=True)
# 若卡顿超过 120 秒自动输出:
faulthandler.dump_traceback_later(120, repeat=True)

4) 逐步跟踪执行过程(效果显著但资源密集)

python -m trace --trace xx.py
# 或
python -m trace --trace -m unittest discover -v

您将看到每行代码的执行过程;当输出“停滞”时即为卡顿位置。

5) 立即启用调试器

python -m pdb xx.py         # 若 xx.py 调用了 unittest.main()
# 在可疑行设置断点:
# (Pdb) b 模块名.py:行号
# (Pdb) c

对于发现模式运行,可在可疑位置添加 import pdb; pdb.set_trace()

6) 常见原因与快速修复

7) 增强可见性

8) 若仅在某 Python 版本卡顿


若提供 faulthandler 的跟踪信息(或 trace --trace 的最后输出),我可帮您定位具体原因并提供针对性解决方案。


Back

openai/gpt-5

Donate