禁用“用户”pdb.set\u跟踪()第

2024-04-19 13:36:01 发布

您现在位置:Python中文网/ 问答频道 /正文

注意:这与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\u跟踪让它在鼻子测试下什么都不做?

  • 另一种选择:下拉到nosetests自己的调试器,就像从nosetests --pdb得到的一样?

我的测试通过stdif __name__ == "__main__":知道它们是否在nosetests之下。你知道吗


Tags: ifexception模式traceassert单元测试nosetestssomething
3条回答

mocking的想法是好的,但我有时会觉得mock有点让人望而生畏,很难尽早找到mock目标来修补它。但我真的不需要什么复杂的东西,只是一种无所事事的行为。你知道吗

我就是这么做的:

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的调试器在其他异常时触发。你知道吗

这是在Python2.7的nosetests上

这是一个混乱的解决方案,但你可以使用单元测试.mock你知道吗

像这样的

import unittest.mock
with mock.patch('pdb.set_trace') as mock:
  #run tests

如果您使用nosetests -s(或 nocapture),那么您将得到实际的pdb提示,而不是挂起。当然,这只有在以交互方式运行测试时才有帮助,但这可能仍然是一种改进。你知道吗

相关问题 更多 >