121 votes

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

J'utilise py.test pour tester unitairement mon programme python. Je souhaite déboguer mon code de test avec le débogueur python de la manière normale (c'est-à-dire pdb.set_trace() dans le code) mais je n'arrive pas à le faire fonctionner.

Mettre pdb.set_trace() dans le code ne fonctionne pas (lève IOError : reading from stdin while output is captured). J'ai également essayé d'exécuter py.test avec l'option --pdb mais cela ne semble pas fonctionner si je veux explorer ce qui se passe avant mon assertion. Le programme s'interrompt lorsqu'une assertion échoue, et continuer à partir de cette ligne signifie terminer le programme.

Est-ce que quelqu'un connaît un moyen d'obtenir le débogage, ou est-ce que le débogage et py.test ne sont tout simplement pas faits pour être ensemble ?

4voto

Arthur Genet Points 11

Il suffit d'utiliser : pytest --trace test_your_test.py . Ceci invoquera le débogueur Python au début du test

2voto

gerrit Points 1588

Ajouter et supprimer points d'arrêt sans éditer les fichiers source

Bien que vous puissiez ajouter des points d'arrêt en ajoutant breakpoint() o set_trace() à votre code, cette approche pose deux problèmes :

  • Tout d'abord, une fois que vous avez commencé à exécuter votre code, il n'y a aucun moyen de supprimer votre point d'arrêt. Je constate souvent qu'une fois que j'ai commencé à exécuter mon code et que j'ai atteint un premier point d'arrêt, je veux en placer un autre et supprimer le premier point d'arrêt. Après breakpoint() me laisse dans le débogueur, je peux ajouter des points d'arrêt supplémentaires, mais je ne peux pas supprimer le point d'arrêt initial. Bien qu'il soit possible d'atténuer quelque peu ce problème en plaçant le point d'arrêt initial de breakpoint Si vous avez des tests paramétrés, même cela est limité. Il se peut que je me retrouve à répéter cont très souvent.
  • Deuxièmement, il faut modifier le code source. Vous devez vous rappeler de supprimer tous les breakpoint() avant de soumettre du code au contrôle de version, vous devez les supprimer avant de changer de branche, etc. Il m'arrive parfois de vouloir utiliser le débogueur pour comparer des tests entre deux branches, et le fait de devoir éditer le code source pour ajouter un point d'arrêt à chaque fois rend cet exercice considérablement plus lent et plus sujet aux erreurs. Je peux même vouloir ajouter un point d'arrêt dans une bibliothèque que j'appelle, auquel cas le fichier que j'édite ne se trouve peut-être même pas dans mon dépôt git mais quelque part dans mon environnement conda, ce qui augmente le risque d'oublier de le supprimer. Editer des fichiers pour ajouter des points d'arrêt est, à mon humble avis, laid.

Ajouter et supprimer interactivement sans éditer de fichiers source, vous pouvez évoquer des points d'arrêt pytest comme suit (dans le shell bash) :

python -mipdb $(type -p pytest) -s test_fileset.py

Les -s est crucial ici, car il empêche pytest de manipuler stdin et stdout, et lorsqu'il est exécuté dans le débogueur, pytest ne manipulera pas stdin et stdout et tout se passera mal. La syntaxe d'appel exacte sera différente selon les shells.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X