So führen Sie ipdb.set_trace () nach Belieben aus, während Sie Pytest-Tests ausführen

96

Ich verwende pytest für meine Testsuite. Während ich Fehler in komplexen Tests zwischen Komponenten abfange, möchte ich sie import ipdb; ipdb.set_trace()in die Mitte meines Codes stellen, damit ich sie debuggen kann.

Da jedoch pytest sys.stdin / sys.stdout abfängt, schlägt ipdb fehl. Wie kann ich ipdb beim Testen mit pytest verwenden?

Ich bin nicht daran interessiert, nach einem Fehler zu pdb oder ipdb zu springen, sondern Pausen an einer beliebigen Stelle im Code zu platzieren und dort zu debuggen, bevor der Fehler auftritt.

manu
quelle

Antworten:

152

Der Fehler wird aufgrund der py.test-Erfassungsausgabe ausgelöst.

Sie sollten py.test mit der -sOption ausführen (Capture-Ausgabe deaktivieren ). Beispielsweise:

py.test -s my_test.py
petRUShka
quelle
10
Wenn Sie dies in Django tun möchten, fügen Sie addopts = -ses der pytest.iniDatei hinzu.
Rahul Gupta
37

pytest-ipdb wird leider nicht mehr unterstützt.

Die Lösung ist zu laufen pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Aus dem Hilfebefehl:

pytest -h
  --pdb                 start the interactive Python debugger on errors.
  --pdbcls=modulename:classname
                        start a custom interactive Python debugger on errors.
                        For example:
                        --pdbcls=IPython.terminal.debugger:TerminalPdb

Der Unterschied ist nur, dass TerminalPdb Fehler zu werfen scheint, Pdb jedoch nicht ( Ipython-Dokumente ).

louis_guitton
quelle
TerminalPdbfunktioniert wieder und die bevorzugte Lösung, da Sie die Registerkarte vervollständigen können.
Uwe L. Korn
Achten Sie auf ppdb, es hat Introspektion in Ipython-Qualität
msudder
2

Das benutze ich

py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s

Avoliva
quelle
0

Ab 2019-11 sollte Folgendes behoben werden:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
Sorin
quelle
1
Wenn Sie die prompt-toolkit Version 2.0.10installieren, funktioniert ipdb wieder einwandfrei, da es aufgrund der kürzlichen Aktualisierung dieses Pakets auf 3.0.0
Pawel Barcik