注意:这与nosetests --pdb ...
我通常在单元测试中使用此模式。
try:
assert something
except Exception, e:
if flag_pdb_enabled: pdb.set_trace()
raise
这样,当我运行单独的测试时,一旦出现异常,我就可以进入调试器。
现在,大多数时候我都小心翼翼地用条件保护pdb.set_trace()
。但有时我会忘记并且有:
try:
assert something
except Exception, e:
pdb.set_trace()
raise
问题是,在nosetests
下,测试暂停,我没有得到调试器正在进行的迹象。然后我必须继续寻找那些流浪无人看守的pdb触发器。
是的,我知道这可能不是最好的QA练习,但除了偶尔意外停止之外,这个系统运作良好。
有没有办法:
修补基本的pdb.set_trace,以便它在nosetests下什么都不做?
替代方案:下载到nosetests自己的调试器中,就像从nosetests --pdb
获取一样?
我的测试通过标准nosetests
了解它们是否在if __name__ == "__main__":
之下。
答案 0 :(得分:1)
这是一个混乱的解决方案,但您可以使用unittest.mock
类似
import unittest.mock
with mock.patch('pdb.set_trace') as mock:
#run tests
答案 1 :(得分:1)
如果您使用nosetests -s
(或--nocapture
),那么您将获得实际的pdb
提示而不是挂起。如果你以交互方式运行测试,这当然有帮助,但它可能仍然是一种改进。
答案 2 :(得分:0)
嘲弄的想法很好,但我有时会发现模拟有点令人生畏,并且很难及早到达模拟目标来修补它。但我真的不需要任何复杂的东西,只需要一个无所事事的行为。
这就是我所做的:
if __name__ == "__main__":
...stuff to run tests...
else:
#existing nosetests branch
def do_nothing(*args, **kwds):
logger.warning("fake pdb.set_trace()")
return
pdb.set_trace = do_nothing
...stuff to run tests...
它运作良好。我的故意pdb.set_trace
完全被忽略了。
甚至不会干扰必须是它自己的函数引用的nosetests --pdb
:我的“用户pdb”打印出假冒和nosetests的调试器在其他异常时触发。
这是Python 2.7的鼻子测试btw。