Python 有没有办法用PyCharm捕获单元测试异常?

Python 有没有办法用PyCharm捕获单元测试异常?,python,unit-testing,debugging,exception,pycharm,Python,Unit Testing,Debugging,Exception,Pycharm,python unittest运行程序处理所有异常。我想用我的调试器捕捉它们 有没有办法让我的unittest runner重新引发测试异常以终止进程? 我想自己处理 编辑:找到解决方案 您可以创建unittest.TestSuite并调用以运行要调试的测试,包括使用调试器捕获异常 使用此模式可以轻松完成: import unittest class DebuggableTestCase(unittest.TestCase): @classmethod def debugTes

python unittest运行程序处理所有异常。我想用我的调试器捕捉它们

有没有办法让我的unittest runner重新引发测试异常以终止进程? 我想自己处理

编辑:找到解决方案

您可以创建unittest.TestSuite并调用以运行要调试的测试,包括使用调试器捕获异常

使用此模式可以轻松完成:

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()

如果您想要检查unittest失败的原因,那么实际上不需要引发异常


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

添加到问题本身的解决方案在IMO中不是很好:

  • 它不适用于PyCharm unittest runner,因此您可以调试它 仅作为脚本而不是测试
  • 它不会打印有关测试进度和结果的信息
  • 我的解决方案更“黑客”,但它没有提到缺点。此外,只有在调试程序下运行测试时,测试行为才会更改

    如果测试不需要异常,则在异常处理程序中调用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)
    
    这个解决方案是用Python3.4和PyCharm 3.4测试的,我知道这是一个旧的线程,当问到这个问题时,其中一些东西可能不存在。但只是为了子孙后代

    你会从盒子里拿出来的。直接说到您的问题,有几种很好的方法可以使用py.test进行调试,包括PyCharm

    特别是为了在任何失败时进行事后调试,您可以安装
    pytest-PyCharm
    插件

    pip install pytest-pycharm
    
    (我正在为每个项目使用virtualenv,因此这对我没有任何负面影响。我建议您也这样做。否则,请注意您正在全局安装它,并且此插件将在使用此Python interpeter的所有项目中处于活动状态。)

    另见:

    • JetBrains PyCharm文档re:,它将告诉您如何使用py.test作为PyCharm中的测试运行程序
    • 堆栈溢出线程:

    根据单元测试的定义,这听起来不像是应该如何运行的。我想这是为了能够更好地了解当它发生故障时发生了什么?这是为了避免为了调试目的而重新运行测试。然后你积极地违背了单元测试的模式和目的。然后你积极地违背了便利性。单元测试的目的是:1。找出不起作用的东西。2.帮助你修复那些不起作用的东西。看看我的解决方案。这就是关键,我不想运行两次单元测试。我设法用一个补丁在我的计算机上解决了这个问题。我修改了unittest\case.py,以便在我的测试用例中使用@unittest.onExceptionGoUnhandled之类的内容时重新引发用户异常。装饰器仅为unittest runner定义一个标志。类似于charm:)在循环项目时,如果一个项目抛出了一些东西,则没有那么大的用处。不适用于Python 2.7.10和PyCharm 4.5.4(在将调用更改为“super”后)。Is在第一次失败的测试时停止,但不进入调试器。