2011-02-09 3 views
68

Nosetests --pdb permettez-moi de m'arrêter en cas d'erreur ou d'échec, mais c'est trop tard pour mes besoins. Passer au travers du code pendant l'exécution m'aide à déboguer là où le problème est. Cependant, les nosetests sont utiles car ils permettent des tests qui reposent sur des importations relatives (c'est-à-dire des tests dans un paquet).définir des points d'arrêt avec nosetests - option pdb

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

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

Cette solution ne suffit pas. Nosetests interfèrent avec la sortie pdb, et mes commandes clavier (par exemple les touches fléchées) sont cassées.

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

Répondre

92

Vous pouvez ajouter

import pdb; pdb.set_trace() 

partout dans votre source que vous voulez arrêter dans le débogueur.

Assurez-vous de passer le -s au nez afin qu'il ne capture pas stdout.

+0

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

+14

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

+1

Ceci n'est cependant pas utile pour les points d'arrêt. – SkyLeach

118

Encore mieux que de se rappeler d'utiliser -s est d'utiliser la variante set_trace qui vient avec le nez. Ajouter

from nose.tools import set_trace; set_trace() 

où vous souhaitez entrer dans le débogueur. La redirection stdin/out sera prise en charge pour vous. Le seul effet secondaire étrange que j'ai rencontré est l'impossibilité de redémarrer votre code à partir de pdb (en utilisant run) pendant le débogage pendant un nez.

+0

@Devin une chance que cela a résolu votre problème? –

+6

Cela a totalement fonctionné pour moi. :) Merci Matt! – bitcycle

+0

Y a-t-il une documentation à ce sujet? Comment sortir de la boucle? – Clayton

1

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

import ipdb; ipdb.set_trace()