définition de points d'arrêt avec l'option nosetests --pdb


88

nosetests --pdblaissez-moi m'arrêter en cas d'erreur ou d'échec, mais c'est trop tard pour mes besoins. Parcourir le code pendant l'exécution m'aide à déboguer où se situe le problème.

Cependant, nosetests sont utiles car ils permettent des tests qui reposent sur des importations relatives (c'est-à-dire des tests dans un package).

Comment puis-je définir des points d'arrêt avant l'exécution des tests? J'utilise actuellement:

python -m pdb /path/to/my/nosetests testfile.py

Cette solution n'est pas adéquate. Nosetests interfèrent avec la sortie pdb et mes commandes de clavier (par exemple les touches fléchées) sont cassées.

Utilisation de l'importation pdb; pdb.set_trace () semble être une bonne idée, cependant nosetests bloque mon accès à la console pdb.

Réponses:


118

Vous pouvez ajouter

import pdb; pdb.set_trace() 

n'importe où dans votre source que vous souhaitez arrêter dans le débogueur.

Assurez-vous de passer -sau nez pour qu'il ne capture pas stdout.


J'étais sur le point d'ajouter ceci à ma question. Ce n'est pas non plus une solution acceptable. Lorsque vous l'utilisez avec nosetests, il est évident que cela est littéralement inutilisable car l'accès à la console pdb est filtré et aucune commande pdb ne peut être exécutée.
Devin

25
Ajoutez l'indicateur -s à nosetests pour l'empêcher de capturer stdout, et vous pourrez utiliser pdb très bien.
Ned Batchelder

1
Ne marche pas. Utilisez ceci:from nose.tools import set_trace; set_trace()
anilbey

142

Mieux encore que de ne pas oublier d'utiliser -sest d'utiliser la set_tracevariante fournie avec Nose. Ajouter

from nose.tools import set_trace; set_trace()

où vous souhaitez vous connecter au débogueur. La redirection stdin / out sera prise en charge pour vous. Le seul effet secondaire étrange que j'ai rencontré est l'incapacité de redémarrer votre code à partir de pdb (en utilisant run) lors du débogage lors d'une course de nez.


Existe-t-il une documentation à ce sujet? Comment sortir de la boucle?
AJ

Vous voulez dire comment naviguer une fois que vous avez pdbcouru? Je suis sûr qu'il y a des documents, mais du haut de ma tête - s"entre dans" un appel de fonction, nva à l'instruction "suivante", udéplace "vers le haut" la pile et dse déplace "vers le bas". Vous pouvez utiliser bpour définir des points d'arrêt et cpour "continuer" et quitter le débogueur pas à pas. J'espère que cela pourra aider!
Matt Luongo

4
Cela devrait être la réponse acceptée. Il fournit toutes les fonctionnalités régulières de la commande originale pdb.set_trace ().
tbm

Une possibilité pour une version ipython / ipdb de ceci?
gerrit

5

Si vous avez ipython , pour une utilisation illimitée:

import ipdb; ipdb.set_trace() 

* génialité illimitée: tout comme ipython - auto-complétion, coloration, etc.


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.