Jak dowolnie wykonywać ipdb.set_trace () podczas wykonywania testów pytest

96

Używam pytest dla mojego zestawu testów. Wyłapując błędy w złożonych testach międzykomponentowych, chciałbym umieścić je import ipdb; ipdb.set_trace()w środku mojego kodu, aby umożliwić mi debugowanie.

Jednak ponieważ pytest pułapki sys.stdin / sys.stdout ipdb nie działa. Jak mogę używać ipdb podczas testowania z pytest.

Nie interesuje mnie przeskakiwanie do pdb lub ipdb po awarii, ale umieszczanie przerw w dowolnym miejscu kodu i możliwość debugowania go tam, zanim wystąpi awaria.

manu
źródło

Odpowiedzi:

153

Błąd jest zgłaszany z powodu przechwytywania danych wyjściowych przez py.test.

Powinieneś uruchomić py.test z -sopcją (wyłącz wyjście przechwytywania). Na przykład:

py.test -s my_test.py
petRUShka
źródło
10
Jeśli ktoś chce to zrobić w Django, dodaj addopts = -sdo pytest.inipliku.
Rahul Gupta
39

pytest-ipdb nie jest już niestety obsługiwane.

Rozwiązaniem jest ucieczka pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Z polecenia pomocy:

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

Różnica polega tylko na tym, że TerminalPdb wydaje się generować błędy, ale Pdb nie ( dokumentacja Ipython ).

louis_guitton
źródło
1
TerminalPdbdziała ponownie i jest preferowanym rozwiązaniem, ponieważ zapewni ci wypełnienie karty.
Uwe L. Korn
uważaj na ppdb, jego introspekcja dotycząca jakości
ipython
2

To jest to, czego używam

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

avoliva
źródło
0

Od 2019-11 oto, co powinno to naprawić:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
sorin
źródło
1
jeśli zainstalujesz prompt-toolkit wersję, 2.0.10ipdb znowu będzie działał dobrze, ponieważ zepsuje się z powodu ostatniej aktualizacji tego pakietu do 3.0.0
Paweł Barcik