2013-04-15 14 views
50

Używam programu pytest do mojego zestawu testów. Podczas łapania błędów w złożonym teście między komponentami, chciałbym umieścić w środku mojego kodu import ipdb; ipdb.set_trace(), aby umożliwić mi debugowanie.Jak wykonać polecenie ipdb.set_trace() podczas testowania pytestów

Jednak, ponieważ pytest traps sys.stdin/sys.stdout ipdb kończy się niepowodzeniem. Jak mogę używać ipdb podczas testowania z pytest.

Nie jestem zainteresowany przeskakiwaniem do pdb lub ipdb po awarii, ale umieszczenie przerw w dowolnym miejscu kodu i możliwość debugowania go tam przed wystąpieniem awarii.

Odpowiedz

78

Błąd został zgłoszony z powodu wyniku wychwytywania py.test.

Należy uruchomić py.test z opcją -s (wyłączyć wyjście przechwytywania). Na przykład:

py.test -s my_test.py 
+7

Jeśli ktoś chce to zrobić w Django, dodaj 'addopts = -s' do pliku' pytest.ini'. –

20

Zainstaluj wtyczkę pytest-ipdb a następnie użyć

pytest.set_trace() 
+7

Zauważ, że 'pytest-ipdb' nie jest już konserwowany, sugerując [' pdbpp'] (https://pypi.python.org/pypi/pdbpp/) jako alternatywę. Jednak program pytest obsługuje również skrót '' pytest.set_trace() 'natywnie] (http://doc.pytest.org/en/latest/usage.html?highlight=set_trace#setting-a-breakpoint-aka-set- trace) i, [od 3.0] (http://doc.pytest.org/en/latest/changelog.html#id7), umożliwia przekazanie niestandardowej klasy debuggera, takiej jak '--pdbcls = IPython.core.debugger: Pdb '. – tutuDajuju

10

pytest-ipdb niestety nie jest już wspierane.

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

Z polecenia help:

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 jest tak, że wydaje się rzucać TerminalPdb erros, ale nie Pdb (Ipython docs).

Powiązane problemy