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.

Devin
la source

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.

Ned Batchelder
la source
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.

Matt Luongo
la source
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.

Shubham Chaudhary
la source
1

Si vous utilisez pytest , vous pouvez utiliser

import pytest; pytest.set_trace()

Consultez la documentation .

gerrit
la source