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.

manu
la source

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
petRUShka
la source
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 ).

louis_guitton
la source
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

avoliva
la source
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'
Sorin
la source
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