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()
我知道这是一个旧线程,也许在提出问题时其中一些内容并不存在。但只是为了后代......
unittest
测试。您将立即获得一些很棒的功能。直接针对您的问题,有一些使用 py.test 进行调试的好方法,包括使用 PyCharm。
专门用于调试任何故障,事后分析,使用 PyCharm - 您所要求的 - 您可以安装
pytest-pycharm
插件。
pip install pytest-pycharm
(我正在每个项目的 virtualenv 中工作,所以这对我来说没有任何缺点。我建议您也这样做。否则,请注意您正在全局安装它,并且此插件将对使用此 Python 的所有项目有效解释者。)
另请参阅:
添加到问题本身的解决方案在我看来并不是很好:
我的解决方案比较“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 进行测试
只需在发生异常的行设置断点并在调试模式下运行即可。 PyCharm 将转到调试屏幕并让您检查变量和调用堆栈。