Come eseguire ipdb.set_trace () a piacimento durante l'esecuzione dei test pytest


96

Sto usando pytest per la mia suite di test. Mentre rilevo bug in un test complesso tra componenti, vorrei import ipdb; ipdb.set_trace()metterlo nel mezzo del mio codice per consentirmi di eseguirne il debug.

Tuttavia, poiché pytest trap sys.stdin / sys.stdout ipdb fallisce. Come posso usare ipdb durante il test con pytest.

Non mi interessa passare a pdb o ipdb dopo un errore, ma inserire interruzioni in qualsiasi punto del codice ed essere in grado di eseguirne il debug prima che si verifichi l'errore.

Risposte:


153

L'errore viene generato a causa della cattura dell'output di py.test.

Dovresti eseguire py.test con l' -sopzione (disattivare l'output di acquisizione). Per esempio:

py.test -s my_test.py

10
Nel caso in cui si desideri farlo in Django, aggiungi addopts = -sal pytest.inifile.
Rahul Gupta

39

purtroppo pytest-ipdb non è più supportato.

La soluzione è correre pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Dal comando di aiuto:

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

La differenza è solo che TerminalPdb sembra lanciare errori, ma Pdb no ( Ipython docs ).


1
TerminalPdbsta funzionando di nuovo e la soluzione preferita in quanto ti darà il completamento della scheda.
Uwe L. Korn il

attenzione a ppdb, ha un'introspezione di qualità
ipython

2

Questo è quello che uso

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


0

Come di 2019-11 ecco cosa dovrebbe risolverlo:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'

1
se installi la prompt-toolkit versione, 2.0.10ipdb funzionerà di nuovo bene, perché si interrompe a causa del recente aggiornamento di questo pacchetto alla 3.0.0
Pawel Barcik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.