如何让pytest不捕获异常

当我在vscode调试器中运行pytest并选中“未捕获的异常”,并且有测试错误时,不会发生未捕获的异常,因为pytest会捕获它们进行结果报告。我怎样才能告诉pytest让异常发生?这样我才能在vscode调试器中找到它们?

基本上我想要类似--pdb的行为,但是我希望它启动vscode调试器而不是pdb。标记--pdbcls听起来很有前途,但不确定要给它什么<module>:<class>

注意:通常,我只会在引发异常时中断它。但是我们的代码中有很多引发但被捕获的异常,因此该选项没有用。

以下是在调试pytest测试时触发AssertionError时vscode不中断的视频:

如何让pytest不捕获异常

@ rioV8的以下建议确实打破了例外,但是由于某些原因,没有堆栈,这意味着您无法从此处进行调试:

如何让pytest不捕获异常

我必须缺少一些东西,因为似乎没有其他人需要此功能。但是对我来说,这似乎绝对是使用测试框架和调试器可以做的最基本的最简单的事情:作为开发人员,我想从引发错误的角度进行调试。

人们在使用带有pytest的调试器时,肯定有其他完全不同的方式,我忽略了一些显而易见的技术。

iCMS 回答:如何让pytest不捕获异常

我用pytest提出了an issue,他们提出了一个可行的建议。将此添加到您的conftest.py

import os
import pytest

if os.getenv('_PYTEST_RAISE',"0") != "0":

    @pytest.hookimpl(tryfirst=True)
    def pytest_exception_interact(call):
        raise call.excinfo.value

    @pytest.hookimpl(tryfirst=True)
    def pytest_internalerror(excinfo):
        raise excinfo.value

然后在您的"request": "test" launch.json文件中,您可以切换该环境变量:

    {
        "name": "Debug Tests","type": "python","request": "test","console": "integratedTerminal","justMyCode": true,"env": {
            "_PYTEST_RAISE": "1"
        },}

如果设置了_PYTEST_RAISE,并且仅选中了未捕获的异常框,则会在未引发异常的地方断行。

我还用debugpy打开了an issue,他们有一些想法,但是今天没有解决方案。 _PYTEST_RAISE技巧可以100%为我解决。

,

行为不同,但是测试运行程序在未捕获的异常处停止。

将文件conftest.py与测试一起添加到目录中。

# conftest.py
def pytest_exception_interact(node,call,report):
  print( call.excinfo.traceback[0] )
  pass

这为任何未捕获的异常添加了一个钩子。

在与pass的行处放置一个断点。

然后Debug测试。

在“调试”控制台中查看,您会看到发生异常的文件和行号。

test_example.py F  File 'path\\test_example.py':4 in test_example
  assert False

调试器在pass行停止。

您可以根据自己的喜好使此挂钩起作用。

,

我注意到一些可能相关的事情。即使我现在还没有准备好深入挖掘,我还是会把它们贴在这里,以防它们对某人有用。

解决方法:

我使用的一个简单技巧是(暂时)直接调用相关测试用例并“运行和调试”文件,而不是使用“调试测试用例”按钮: >

Error: object 'output_4' not found

结果:

enter image description here

注意事项:

  1. 行为的重要区别与在 def test_example(): assert False test_example() 配置中指定 "request": "test" 与指定 "request": "launch" 相关。 (在 launch.json 选项是否从全局启动配置中应用(如 here 所述)方面,这两种类型之间也存在差异。
  2. 如果您指定了 python justMyCode,那么 VSCode 似乎不会让您像上面那样在启动模式下调试文件。
  3. 在我的场景中,我的测试失败了,因为我在第三方库中引发了异常(当然是我的错)。第三方代码中的断点显然只有在添加 "request": "test" 选项时才会触发。

launch.json:

"justMyCode": false
本文链接:https://www.f2er.com/2117883.html

大家都在问