2013-04-15 7 views
50

Sto usando pytest per la mia suite di test. Durante la cattura di bug nel complesso test inter-componenti, vorrei inserire import ipdb; ipdb.set_trace() nel mezzo del mio codice per permettermi di eseguire il debug.Come eseguire ipdb.set_trace() a volontà durante l'esecuzione di test di pytest

Tuttavia, poiché pytest traps sys.stdin/sys.stdout ipdb non riesce. Come posso usare ipdb mentre collaudo con pytest.

io non sono interessato a saltare a PDB o IPDB dopo un guasto, ma per inserire le interruzioni di qualsiasi parte del codice e essere in grado di eseguire il debug di lì prima che si verifichi l'errore.

risposta

78

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

È necessario eseguire py.test con l'opzione -s (disattivare l'acquisizione). Per esempio:

py.test -s my_test.py 
+7

Nel caso si voglia fare questo in Django, aggiungere 'addopts = -s' al file' pytest.ini'. –

20

installare il plugin pytest-ipdb e quindi usare

pytest.set_trace() 
+7

Si noti che 'pytest-ipdb' non è più mantenuto, suggerendo [' pdbpp'] (https://pypi.python.org/pypi/pdbpp/) come alternativa. Tuttavia, pytest supporta anche [la scorciatoia 'pytest.set_trace()' nativamente] (http://doc.pytest.org/en/latest/usage.html?highlight=set_trace#setting-a-breakpoint-aka-set- trace) e, [dal 3.0] (http://doc.pytest.org/en/latest/changelog.html#id7), consente di passare una classe debugger personalizzata come '--pdbcls = IPython.core.debugger: Pdb '. – tutuDajuju

10

pytest-IPDB non è purtroppo più supportato.

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

Dal comando 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 

La differenza è solo che TerminalPdb sembra gettare erros, ma non Pdb (Ipython docs).