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


96

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

Cependant, comme pytest intercepte sys.stdin / sys.stdout, ipdb échoue. Comment puis-je utiliser ipdb tout en testant 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à-bas avant que l'échec ne se produise.

Réponses:


153

L'erreur est générée en raison de la sortie de capture de py.test.

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

py.test -s my_test.py

10
Au cas où l'on voudrait faire cela dans Django, ajoutez addopts = -sau pytest.inifichier.
Rahul Gupta

39

pytest-ipdb n'est malheureusement plus supporté.

La solution est de courir pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Depuis la commande 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 différence est simplement que TerminalPdb semble générer des erreurs, mais pas Pdb ( documentation Ipython ).


1
TerminalPdbfonctionne à nouveau et la solution préférée car elle vous donnera l'achèvement de l'onglet.
Uwe L. Korn

recherchez ppdb, son introspection de qualité
ipython

2

C'est ce que j'utilise

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


0

À partir de 2019-11, voici ce qui devrait y remédier:

pip install ipdb gnureadline ptpython

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

1
si vous installez la prompt-toolkit version, 2.0.10ipdb fonctionnera à nouveau correctement, car il se casse en raison de la récente mise à jour de ce paquet vers la version 3.0.0
Pawel Barcik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.