VS Code / Python / Debugging-Test Test mit dem Debugger

Aug 27 2020

Wie kann ich VS Code dazu bringen, mich zum Zeitpunkt des Fehlers in den Debugger zu setzen, wenn Tests mit pytest ausgeführt werden?

Pytest fängt alle Fehler ab und behauptet, und VS-Code ruft den Debugger nur bei nicht erfassten Fehlern auf (ich kann dies in eine ausgelöste Ausnahme ändern, aber dann stoppt es bei allem, was bei einem Versuch ausgelöst wird).

Ich habe versucht, --pdbals pytest-Argument zu setzen, aber dies führt zu Fehlern:

============================= test session starts =============================
platform win32 -- Python 3.8.1, pytest-5.3.2, py-1.8.1, pluggy-0.13.1
rootdir: c:\Projects\debugtest, inifile: pytest.ini
collected 1 item

test.py F
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Traceback (most recent call last):
  File "C:\Projects\debugtest\test.py", line 4, in test_with_assert
    assert 42==2.71828
AssertionError: assert 42 == 2.71828
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>>>>>>>>>>>>>>> PDB post_mortem (IO-capturing turned off) >>>>>>>>>>>>>>>>>>
> c:\projects\debugtest\test.py(4)test_with_assert()
-> assert 42==2.71828
(Pdb)

PYDEV DEBUGGER WARNING:
sys.settrace() should not be used when the debugger is being used.
This may cause the debugger to stop working correctly.
If this is needed, please check: 
http://pydev.blogspot.com/2007/06/why-cant-pydev-debugger-work-with.html
to see how to restore the debug tracing back correctly.
Call Location:
  File "C:\Program Files\Python38\lib\bdb.py", line 359, in set_quit
    sys.settrace(None)


- generated xml file: C:\Users\tzhgfma1\AppData\Local\Temp\tmp-24044mEWMyB1nPYAu.xml -
!!!!!!!!!!!!!!!!!! _pytest.outcomes.Exit: Quitting debugger !!!!!!!!!!!!!!!!!!!
============================== 1 failed in 0.43s ==============================

Ich habe ein sehr einfaches Projekt, um dies zu testen:

.vscode \ settings.json

{
    "python.testing.pytestArgs": [
        "--pdb"
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.nosetestsEnabled": false,
    "python.testing.pytestEnabled": true,
    "git.ignoreLimitWarning": false
}

.vscode \ launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}", "console": "internalConsole", "justMyCode":false }, { "name": "Python: Attach using Process Id", "type": "python", "request": "attach", "processId": "${command:pickProcess}",
            "justMyCode": false
        },
        {
            "name": "Debug Tests",
            "type": "python",
            "request": "test",
            "console": "internalConsole",
            "justMyCode": false
        }
    ]
}

pytest.ini

[pytest]

python_files = test*.py
python_classes = Test
python_functions = test
addopts = --tb=native
console_output_style = classic
junit_duration_report = call
filterwarnings =
    ignore::RuntimeWarning

und test.py:

def test_with_assert():
    assert 42==2.71828

Ist --pdbder richtige Weg dies zu tun? Oder wie gebe ich den Debugger bei einer Bestätigung oder einem Fehler ein?

Antworten

2 JillCheng Aug 31 2020 at 07:54

Wenn Sie beim Ausführen von pytest in VSCode das Debuggen eingeben und in einer Codezeile bleiben möchten, können Sie Debug Testnach Auswahl des pytest-Tests oben in der Methode auf ' ' klicken, wie im Screenshot gezeigt:

Außerdem befindet sich "python.testing.pytestArgs": [],in .vscode\settings.jsonder Ordnerpfad der getesteten Datei. Beispielsweise befindet sich meine Testdatei Test_ccunter dem aOrdner.

>      "python.testing.pytestArgs": [
>             "a/Test_cc"
>         ],

Wenn dies nicht das ist, was Sie wollen, lassen Sie es mich bitte wissen und beschreiben Sie die Details Ihrer Bedürfnisse.

Referenz: Debug-Tests .

Aktualisieren:

Wenn wir den Test in VSCode debuggen, ohne einen Haltepunkt dafür festzulegen, wird normalerweise nur das Testergebnis angezeigt. (Erfolg oder Misserfolg). Es werden nur relevante Testinformationen in der Konsolenausgabe angezeigt.

Wenn ich die Erweiterung ' Python Test Explorer for Visual Studio code' verwende, werden die Debugging-Testinformationen auf der Konsole angezeigt, was zu dem Problem führt.

mgf Sep 05 2020 at 07:53

Diese Antwort löst das Problem tatsächlich. Ich wünschte, es gäbe einen einfacheren Weg, entweder mit Visual Studio Code oder mit einer einfachen raiseFlagge von pytest.