有没有办法用PyCharm捕获unittest异常?

时间:2012-12-29 11:48:48

标签: python unit-testing debugging exception pycharm

python unittest runner处理所有异常。我想用我的调试器来捕获它们。

有没有办法让我的unittest跑步者重新提高测试异常以终止进程? 我想自己处理它们。

修改:找到解决方案。

您可以创建unittest.TestSuite并调用debug()来运行您要调试的测试 - 包括使用调试器捕获异常!

使用这种模式可以轻松完成:

import unittest

class DebuggableTestCase(unittest.TestCase):
    @classmethod
    def debugTestCase(cls):
        loader = unittest.defaultTestLoader
        testSuite = loader.loadTestsFromTestCase(cls)
        testSuite.debug()

class MyTestCase(DebuggableTestCase):
    def test_function_that_fails(self):
        raise Exception('test')

if __name__ == '__main__':
    MyTestCase.debugTestCase()

3 个答案:

答案 0 :(得分:2)

问题本身的解决方案并不是很好的IMO:

  1. 它不能与PyCharm unittest runner一起使用,所以你可以调试它 仅作为脚本而非测试。
  2. 它不会打印有关测试进度和结果的信息。
  3. 我的解决方案更多" hacky",但它没有提到缺点。此外,只有在调试器下运行测试时,测试行为才会发生变化。

    如果测试不期望异常,则在异常处理程序中调用

    unittest.TestResult.addError。我重新定义了这个方法来重新引发正在处理的异常。

    我将此类用作测试用例的父级:

    class DebuggableTestCase(unittest.TestCase):
        def __add_error_replacement(self, _, err):
            value, traceback = err[1:]
            raise value.with_traceback(traceback)
    
        def run(self, result=None):
            if result and sys.gettrace() is not None:
                result.addError = self.__add_error_replacement
            super().run(result)
    

    使用Python 3.4和PyCharm 3.4测试解决方案

答案 1 :(得分:2)

我知道这是一个老线程,当问到这个问题时,也许其中一些事情并不存在。但仅限后人......

You can run your unittest tests with py.test as a test runner.您可以立即获得一些great features。直接到你的问题,有一些很好的方法来调试py.test,包括使用PyCharm。

具体到调试任何失败,验尸,使用PyCharm - 您要求的 - 您可以安装pytest-pycharm插件。

pip install pytest-pycharm

(我在每个项目的virtualenv工作,所以这对我来说没有任何缺点。我建议你这样做。否则,请注意你在全球安装它,这个插件将对所有使用的项目都是活跃的这个Python插件。)

另见:

答案 2 :(得分:1)

如果你想要的是检查unittest失败的原因,你真的不需要提出异常。

只需在发生异常的行设置断点并在调试模式下运行。 PyCharm将进入调试屏幕,让您检查变量和调用堆栈。