web-dev-qa-db-fra.com

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

J'utilise pytest pour ma suite de tests. Lors de la capture de bogues dans un test inter-composants complexe, je voudrais placer import ipdb; ipdb.set_trace() au milieu de mon code pour me permettre de le déboguer.

Cependant, puisque pytest intercepte sys.stdin/sys.stdout ipdb échoue. Comment puis-je utiliser ipdb pendant les tests avec pytest.

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

80
manu

L'erreur est déclenchée en raison de la sortie de capture pytest.

Vous devez exécuter py.test avec l'option -s (Désactiver la sortie de capture). Par exemple:

py.test -s my_test.py
127
petRUShka

pytest-ipdb n'est malheureusement plus supporté.

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

Depuis 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 juste que TerminalPdb semble lancer des erreurs, mais pas Pdb ( Ipython docs ).

29
louis_guitton

Installez le plugin pytest-ipdb puis utilisez

pytest.set_trace()
24
joar