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.

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

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 ).


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


0

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

pip install ipdb gnureadline ptpython

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.