web-dev-qa-db-fra.com

Puis-je déboguer avec python débogueur lorsque j'utilise py.test d'une manière ou d'une autre?

J'utilise py.test pour les tests unitaires de mon programme python. Je souhaite déboguer mon code de test avec le débogueur python de manière normale (j'entends par là pdb.set_trace () dans le code) mais je ne peux pas le faire fonctionner.

Mettre pdb.set_trace () dans le code ne fonctionne pas (déclenche IOError: lecture depuis stdin pendant que la sortie est capturée). J'ai également essayé d'exécuter py.test avec l'option --pdb mais cela ne semble pas faire l'affaire si je veux explorer ce qui se passe avant mon assertion. Il se casse lorsqu'une assertion échoue, et passer de cette ligne signifie terminer le programme.

Est-ce que quelqu'un connaît un moyen d'obtenir le débogage, ou le débogage et py.test ne sont-ils simplement pas destinés à être ensemble?

57
Joel

c'est très simple: mettez un assert 0 où vous voulez commencer le débogage dans votre code et lancez vos tests avec:

py.test --pdb 

terminé :)

Alternativement, si vous utilisez pytest-2.0.1 ou supérieur, il existe également l'assistant pytest.set_trace() que vous pouvez placer n'importe où dans votre code de test. Voici les docs . Il veillera à désactiver en interne la capture avant de vous envoyer sur la ligne de commande du débogueur pdb.

84
hpk42

J'ai trouvé que je peux exécuter py.test avec capture désactivée, puis utiliser pdb.set_trace () comme d'habitude.

> py.test --capture=no
============================= test session starts ==============================
platform linux2 -- Python 2.5.2 -- pytest-1.3.3
test path 1: project/lib/test/test_facet.py

project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something()
-> code_about_to_run('')
(Pdb)
33
Jason R. Coombs

Le moyen le plus simple consiste à utiliser le mécanisme py.test pour créer un point d'arrêt

http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace

import pytest
def test_function():
    ...
    pytest.set_trace()    # invoke PDB debugger and tracing

Ou si vous voulez que le débogueur de pytest soit à une ligne, changez votre import pdb; pdb.set_trace() en import pytest; pytest.set_trace()

18
Rach

Je ne connais pas py.test, mis pour unittest, vous faites ce qui suit. Peut-être que py.test est similaire:

Dans votre module de test (mytestmodule.py):

if __== "__main__":
    unittest.main(module="mytestmodule")

Exécutez ensuite le test avec

python -m pdb mytestmodule.py

Vous obtiendrez un shell pdb interactif.

En regardant les documents, on dirait que py.test a un --pdb option de ligne de commande:

http://codespeak.net/py/dist/test/features.html

1
Peter Lyons