使用鼻子测试--pdb选项设置断点


88

nosetests --pdb让我在出现错误或失败时停止操作,但这对我来说太迟了。在执行过程中单步执行代码可以帮助我调试问题所在。

但是,鼻子测试很有用,因为它们允许依赖于相对进口的测试(即包装中的测试)。

在执行测试之前如何设置断点?目前,我正在使用:

python -m pdb /path/to/my/nosetests testfile.py

该解决方案是不够的。Noestest会干扰pdb的输出,并且我的键盘控件(例如,箭头键)已损坏。

使用import pdb; pdb.set_trace()似乎是个好主意,但是鼻子测试阻止了我对pdb控制台的访问。

Answers:


118

你可以加

import pdb; pdb.set_trace() 

您要在调试器中停止的源代码中的任何位置。

确保您经过-s鼻子,使其不会被抓住stdout


我只是要将其添加到我的问题中。这也不是可接受的解决方案。当将其与鼻子测试一起使用时,显然这实际上是不可用的,因为会屏蔽对pdb控制台的访问,并且无法执行任何pdb命令。
Devin

25
在鼻子测试中添加-s标志,以防止其捕获标准输出,您就可以使用pdb了。
Ned Batchelder

1
不起作用。使用这个:from nose.tools import set_trace; set_trace()
anilbey

142

比记住使用更好的-s是使用set_traceNose随附的变体。加

from nose.tools import set_trace; set_trace()

无论您想闯入调试器。stdin / out重定向将为您处理。我遇到的唯一奇怪的副作用是,run在鼻子运行期间进行调试时,无法从pdb内部重新启动代码(使用)。


有任何相关文件吗?如何摆脱循环?
AJ

您的意思是pdb跑步后如何导航?我确定有文档,但是从头开始- s“进入”函数调用,n转到“ next”语句,u“向上” d移动堆栈,然后“向下”移动。您可以b用来设置断点并c“继续”并退出步进调试器。希望有帮助!
马特·鲁昂戈

4
这应该是公认的答案。它提供了原始pdb.set_trace()命令的所有常规功能。
tbm

这个的ipython / ipdb版本有可能吗?
杰里特

5

如果您具有ipython,那么可以使用以下功能:

import ipdb; ipdb.set_trace() 

*无限的超赞功能:就像ipython一样-自动补全,着色等


1

如果您正在使用pytest,则可以使用

import pytest; pytest.set_trace()

请参阅文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.