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

问题描述 投票:0回答:4

python 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()
python unit-testing debugging exception pycharm
4个回答
8
投票

我知道这是一个旧线程,也许在提出问题时其中一些内容并不存在。但只是为了后代......

您可以使用 py.test 作为测试运行程序来运行您的

unittest
测试。您将立即获得一些很棒的功能。直接针对您的问题,有一些使用 py.test 进行调试的好方法,包括使用 PyCharm。

专门用于调试任何故障,事后分析,使用 PyCharm - 您所要求的 - 您可以安装

pytest-pycharm
插件。

pip install pytest-pycharm

(我正在每个项目的 virtualenv 中工作,所以这对我来说没有任何缺点。我建议您也这样做。否则,请注意您正在全局安装它,并且此插件将对使用此 Python 的所有项目有效解释者。)

另请参阅:


2
投票

添加到问题本身的解决方案在我看来并不是很好:

  1. 它无法与 PyCharm 单元测试运行器一起使用,因此您可以对其进行调试 仅作为脚本而不是测试。
  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 进行测试


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

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


0
投票
尽管

pytest-pycharm

,还有一个有点隐藏的设定:

设置 |构建、执行、部署 | Python 调试器 |测试失败时放入调试器

另请参阅

PY-9848:测试失败时停止的异常断点

© www.soinside.com 2019 - 2024. All rights reserved.