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

2 minutos de lectura

avatar de usuario
hombre

Estoy usando pytest para mi conjunto de pruebas. Al detectar errores en pruebas complejas entre componentes, me gustaría colocar import ipdb; ipdb.set_trace() en 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 estoy interesado en 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.

avatar de usuario
petRUShka

El error se genera porque pytest captura la salida de forma predeterminada.

Puedes ejecutar pytest con -s opción (desactivar salida de captura). Por ejemplo:

py.test -s my_test.py

y luego en my_test.py:

import ipdb;
ipdb.set_trace()

  • En caso de que uno quiera hacer esto en Django, agregue addopts = -s a pytest.ini expediente.

    – Raúl Gupta

    2 de diciembre de 2015 a las 17:18


avatar de usuario
louis_guitton

Desafortunadamente, pytest-ipdb ya no es compatible.

La solución es ejecutar
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 que TerminalPdb parece arrojar errores, pero Pdb no (documentos de ipython).

  • TerminalPdb está funcionando nuevamente y es la solución preferida, ya que le dará la finalización de la pestaña.

    – Uwe L. Korn

    5 de agosto de 2019 a las 17:53

  • busque ppdb, tiene introspección de calidad ipython

    – msudder

    3 abr 2020 a las 16:20

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'

  • si instalas prompt-toolkit versión 2.0.10 entonces ipdb volverá a funcionar bien, porque se rompe debido a la actualización reciente de este paquete a 3.0.0

    – Pawel Barcik

    28 de noviembre de 2019 a las 9:56

Es posible que desee dar pdbpp un intento. He tenido más éxito con él, en comparación con ipdb cuando se usa con pytest. Vea mi respuesta aquí: https://stackoverflow.com/a/69320311/2896799.

¿Ha sido útil esta solución?