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

2024-05-29 01:36:18 发布

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

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

有没有办法让我的UnitTestRunner重新引发测试异常来终止进程? 我想自己处理。在

编辑:找到解决方案。在

您可以创建单元测试套件并调用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()

Tags: debugtest进程defloaderunittest调试器class
3条回答

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

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

这个问题本身的解决方案在我看来并不好:

  1. 它不能与PyCharm unittest runner一起工作,所以可以调试它 只是作为脚本而不是测试。在
  2. 它不打印有关测试进度和结果的信息。在

我的解决方案更“老套”,但没有提到缺点。此外,只有在调试器下运行测试时,测试行为才会更改。在

在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进行了测试

我知道这是一个老问题,也许当有人问这个问题时,其中一些东西并不在身边。只是为了子孙后代。。。

You can run your ^{} tests with py.test as a test runner.你会从盒子里取出一些great features。直接针对您的问题,有一些好的方法可以用来调试py.测试包括PyCharm。在

特别是在任何失败时调试,事后检查,使用PyCharm(您所要求的)可以安装pytest-pycharm插件。在

pip install pytest-pycharm

(我在每个项目中都在虚拟环境中工作,所以这对我来说没有坏处。我建议你也这样做。否则,请注意,您是在全局范围内安装它,并且此插件对于使用此Python interpeter的所有项目都是活动的。)

另请参见:

相关问题 更多 >

    热门问题