VS Code / Python / Debugging Pytest Test con el depurador

Aug 27 2020

¿Cómo puedo hacer que VS Code me coloque en el depurador en el punto de falla al ejecutar pruebas con pytest?

Pytest detecta todos los errores y afirma, y ​​el código VS invoca al depurador solo en errores no detectados (puedo cambiar esto a una excepción generada, pero luego se detiene en todo lo que se genera en un intento).

Intenté establecer --pdbcomo argumento pytest, pero esto conduce a errores:

============================= 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 ==============================

Tengo un proyecto muy simple para probar esto:

.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

y test.py:

def test_with_assert():
    assert 42==2.71828

¿Es --pdbla forma correcta de hacer esto? ¿O cómo ingreso al depurador ante una afirmación o error?

Respuestas

2 JillCheng Aug 31 2020 at 07:54

Si desea ingresar a la depuración al ejecutar pytest en VSCode y permanecer en una línea de código, puede hacer clic en ' Debug Test' en la parte superior del método después de seleccionar la prueba de pytest, como se muestra en la captura de pantalla:

Además, "python.testing.pytestArgs": [],en .vscode\settings.jsones la ruta de la carpeta del archivo de prueba, por ejemplo, mi archivo de prueba es en Test_ccvirtud de la acarpeta.

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

Si esto no es lo que desea, hágamelo saber y describa los detalles de sus necesidades.

Referencia: pruebas de depuración .

Actualizar:

Por lo general, cuando depuramos la prueba en VSCode, sin establecer un punto de interrupción para ella, solo mostrará el resultado de la prueba. (éxito o fracaso). Solo mostrará información de prueba relevante en la SALIDA de la consola.

Cuando uso la extensión ' Python Test Explorer for Visual Studio code', mostrará la información de la prueba de depuración en la consola, lo que indica el problema.

mgf Sep 05 2020 at 07:53

Esta respuesta realmente resuelve el problema. Desearía que hubiera una forma más sencilla, ya sea de Visual Studio Code o una simple raisebandera de pytest.