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.