129 votes

Comment exécuter ipdb.set_trace() à volonté lors de l'exécution de tests pytest

J'utilise pytest pour ma suite de tests. En attrapant les bogues dans les tests complexes inter-composants, je voudrais placer import ipdb; ipdb.set_trace() au milieu de mon code pour me permettre de le déboguer.

Cependant, comme pytest piège sys.stdin/sys.stdout, ipdb échoue. Comment puis-je utiliser ipdb tout en testant avec pytest.

Je ne suis pas intéressé par le fait de passer à pdb ou ipdb après un échec, mais de placer des ruptures n'importe où dans le code et de pouvoir les déboguer là avant que l'échec ne se produise.

189voto

petRUShka Points 2172

L'erreur est soulevée parce que pytest capture la sortie par défaut.

Vous pouvez lancer pytest avec -s (désactiver la sortie de capture). Par exemple :

py.test -s my_test.py

et ensuite dans my_test.py :

import ipdb;
ipdb.set_trace()

68voto

louis_guitton Points 1012

Pytest-ipdb n'est malheureusement plus supporté.

La solution consiste à exécuter pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

A partir de la commande d'aide :

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 différence est simplement que TerminalPdb semble lancer des erros, mais pas Pdb ( Documentation sur Ipython ).

7voto

sorin Points 23747

A partir de 2019-11 Voici ce qui devrait régler le problème :

pip install ipdb gnureadline ptpython

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

3voto

avoliva Points 105

Voici ce que j'utilise

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

0voto

Apteryx Points 4279

Vous pouvez donner pdbpp un essai. J'ai eu plus de succès avec lui, comparé à ipdb lorsqu'il est utilisé avec pytest . Voir ma réponse ici : https://stackoverflow.com/a/69320311/2896799 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X