我怎样才能让 pytest 不捕获异常

Phi*_*lip 8 visual-studio-code vscode-debugger vscode-python

当我在 vscode 调试器中运行 pytest 并选中“Uncaught Exceptions”并且有测试错误时,不会发生未捕获的异常,因为 pytest 捕获它们并报告结果。我怎么能告诉 pytest 只让异常发生?以便我可以在 vscode 调试器中捕获它们?

基本上我想要这样的行为,--pdb但我希望它启动 vscode 调试器而不是 pdb。这面旗帜--pdbcls听起来很有希望,但不知道该<module>:<class>送什么。

注意:通常我只会让它在引发异常时中断。但是我们的代码有大量引发但捕获的异常,所以这个选项没有用。

这是在调试 pytest 测试时引发 AssertionError 时 vscode 不会中断的视频:

在此处输入图片说明

@rioV8 下面的建议确实打破了异常,但由于某种原因,没有堆栈,这意味着您无法从那里进行调试:

在此处输入图片说明

我一定遗漏了一些东西,因为似乎没有其他人需要这种能力。但对我来说,这似乎绝对是测试框架和调试器可以做的最基本的最简单的事情:作为开发人员,我想从出现错误的地方进行调试。

人们使用带有 pytest 的调试器肯定有一些完全不同的方式,我忽略了一些明显的技术。

Phi*_*lip 11

我向 pytest提出了一个问题,他们提出了一个可行的建议。将此添加到您的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
Run Code Online (Sandbox Code Playgroud)

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

    {
        "name": "Debug Tests",
        "type": "python",
        "request": "test",
        "console": "integratedTerminal",
        "justMyCode": true,
        "env": {
            "_PYTEST_RAISE": "1"
        },
    }
Run Code Online (Sandbox Code Playgroud)

如果_PYTEST_RAISE设置了并且您只选中Uncaught Exceptions框,您将在之前未引发未捕获异常的地方中断。

我也打开了一个问题debugpy他们有一些想法,但今天没有解决方案。这个_PYTEST_RAISE技巧可以 100% 为我解决这个问题。

  • 当我今天(2022-05-17)尝试此操作时,VSCode 抱怨“test”是无效的请求类型。它说“请求配置类型”。可以是“启动”或“附加”。 (6认同)