【问题标题】:Is there a way to catch unittest exceptions with PyCharm?有没有办法用 PyCharm 捕获单元测试异常?
【发布时间】:2012-12-14 10:00:57
【问题描述】:

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

有没有办法让我的 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()

【问题讨论】:

  • 根据他们的定义,这听起来不像单元测试应该如何运行。我想这是为了能够更好地弄清楚当它已经坏了时发生了什么?
  • 这是为了避免出于调试目的重新运行测试。
  • 那么你就在积极地违背单元测试的模式和目的。
  • 那你就是在积极地违背便利性。单元测试的目的是: 1. 找出不起作用的东西。 2. 帮助你修复那些不起作用的东西。看看我的解决方案。

标签: python unit-testing debugging exception pycharm


【解决方案1】:

如果您想要检查单元测试失败的原因,您实际上不需要引发异常。

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

【讨论】:

  • 这就是重点,我不想运行我的单元测试两次。我设法用补丁解决了我电脑上的问题。如果我对我的 TestCase 使用 @unittest.onExceptionGoUnhandled 之类的东西,我修改了 unittest\case.py 以重新引发我的用户异常。装饰器只为单元测试运行器定义一个标志。像魅力一样工作:)
  • 如果你遍历项目并且一个项目抛出了一些东西,那么它就没有那么有用了。
【解决方案2】:

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

  1. 它不适用于 PyCharm unittest runner,所以你可以调试它 仅作为脚本而非测试。
  2. 它不打印有关测试进度和结果的信息。

我的解决方案更“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 测试解决方案

【讨论】:

  • 不适用于 Python 2.7.10 和 PyCharm 4.5.4(将调用更改为 'super' 后)。是在第一次失败的测试时停止,但不进入调试器。
【解决方案3】:

我知道这是一个旧线程,也许当问题被问到时,其中一些东西并不存在。但只是为了后代......

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 解释器。)

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多