在鼻子下禁用“user”pdb.set_trace()s

时间:2018-01-04 20:09:24

标签: python nose

注意:这与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__":之下。

3 个答案:

答案 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。