13

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

3 回答 3

5

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

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

特别是使用 PyCharm 调试任何故障,事后检查 - 你所要求的 - 你可以安装pytest-pycharm插件。

pip install pytest-pycharm

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

也可以看看:

于 2016-06-24T20:45:09.907 回答
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 进行了测试

于 2014-12-07T18:28:29.200 回答
1

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

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

于 2012-12-29T12:08:53.920 回答