Cómo ejecutar ipdb.set_trace () a voluntad mientras se ejecutan pruebas de pytest

96

Estoy usando pytest para mi suite de pruebas. Mientras detecta errores en pruebas complejas entre componentes, me gustaría colocarlo import ipdb; ipdb.set_trace()en el medio de mi código para permitirme depurarlo.

Sin embargo, dado que pytest atrapa sys.stdin / sys.stdout ipdb falla. ¿Cómo puedo usar ipdb mientras pruebo con pytest.

No me interesa saltar a pdb o ipdb después de una falla, sino colocar interrupciones en cualquier parte del código y poder depurarlo allí antes de que ocurra la falla.

manu
fuente

Respuestas:

153

El error surge debido a que py.test captura la salida.

Debe ejecutar py.test con la -sopción (desactivar la salida de captura). Por ejemplo:

py.test -s my_test.py
petRUShka
fuente
10
En caso de que uno quiera hacer esto en Django, agregue addopts = -sal pytest.iniarchivo.
Rahul Gupta
39

Lamentablemente, pytest-ipdb ya no es compatible.

La solución es correr pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Desde el comando de ayuda:

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 diferencia es solo que TerminalPdb parece arrojar errores, pero Pdb no ( documentos Ipython ).

louis_guitton
fuente
1
TerminalPdbestá funcionando de nuevo y es la solución preferida, ya que le permitirá completar la pestaña.
Uwe L. Korn
cuidado con ppdb, tiene introspección de calidad
ipython
2

Esto es lo que yo uso

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

avoliva
fuente
0

A partir de 2019-11, esto es lo que debería solucionarlo:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
sorin
fuente
1
si instala la prompt-toolkit versión, 2.0.10entonces ipdb funcionará bien nuevamente, porque se rompe debido a la actualización reciente de este paquete a 3.0.0
Pawel Barcik