Parfois, je veux simplement insérer des instructions d'impression dans mon code et voir ce qui est imprimé lorsque je l'exerce. Ma façon habituelle de "faire de l'exercice" est avec les tests de pytest existants. Mais lorsque je les exécute, je ne semble pas voir de sortie standard (au moins depuis PyCharm, mon IDE).
Existe-t-il un moyen simple de voir la sortie standard lors d'un test Pytest?
Réponses:
Le
-s
commutateur désactive la capture par test.la source
-s
=--capture=no
Dans un commentaire en faveur de la réponse acceptée , Joe demande:
Sous UNIX, cela est communément appelé départ . Idéalement, le tee plutôt que la capture serait la valeur par défaut de py.test. Dans l'idéal, ni py.test ni aucun autre plugin py.test tiers existant (... que je sache, de toute façon ) ne prend en charge le tee - malgré le fait que Python supporte trivialement le tee out-of-the-box .
Le py.test de correction de singe pour faire tout ce qui n'est pas pris en charge n'est pas anodin. Pourquoi? Parce que:
_pytest
package privé non destiné à être importé en externe. Si vous tentez de le faire sans savoir ce que vous faites, lepytest
package public déclenche généralement des exceptions obscures lors de l'exécution. Merci beaucoup, py.test. Une architecture vraiment robuste que vous avez obtenue._pytest
manière sécurisée l'API privée de manière simple , vous devez le faire avant d' exécuter lepytest
package public exécuté par lapy.test
commande externe . Vous ne pouvez pas le faire dans un plugin (par exemple, unconftest
module de niveau supérieur dans votre suite de tests). Au moment où py.test parvient paresseusement à importer dynamiquement votre plug-in, toute classe py.test que vous vouliez faire un patch de singe a depuis longtemps été instanciée - et vous n'avez pas accès à cette instance. Cela implique que, si vous souhaitez que votre patch de singe soit appliqué de manière significative, vous ne pouvez plus exécuter lapy.test
commande externe en toute sécurité . Au lieu de cela, vous devez envelopper l'exécution de cette commande avec un setuptools personnalisétest
commande que (dans l'ordre):_pytest
API privée .pytest.main()
fonction publique pour exécuter lapy.test
commande.Cette réponse monkey-patches py.test
-s
et les--capture=no
options pour capturer stderr mais pas stdout. Par défaut, ces options ne capturent ni stderr ni stdout. Ce n'est pas tout à fait évident, bien sûr. Mais chaque grand voyage commence par une préquelle fastidieuse que tout le monde oublie dans cinq ans.Pourquoi faire ceci? Je vais maintenant vous le dire. Ma suite de tests pilotée par py.test contient des tests fonctionnels lents. L'affichage de la sortie standard de ces tests est utile et rassurant, empêchant leycec d'atteindre
killall -9 py.test
quand encore un autre test fonctionnel de longue durée ne fait rien pendant des semaines. Cependant, l'affichage du stderr de ces tests empêche py.test de signaler les retraits d'exception en cas d'échecs de test. Ce qui est complètement inutile. Par conséquent, nous contraignons py.test à capturer stderr mais pas stdout.Avant d'y arriver, cette réponse suppose que vous disposez déjà d'une
test
commande setuptools personnalisée appelant py.test. Si ce n'est pas le cas, consultez la sous-section Intégration manuelle de la page bien écrite des bonnes pratiques de py.test .Ne pas installer pytest-runner , un setuptools tiers fournissant un plugin d' setuptools personnalisés
test
commande demandant également py.test. Si pytest-runner est déjà installé, vous devrez probablement désinstaller ce package pip3, puis adopter l'approche manuelle liée à ci-dessus.En supposant que vous ayez suivi les instructions de l' intégration manuelle soulignées ci-dessus, votre base de code devrait maintenant contenir une
PyTest.run_tests()
méthode. Modifiez cette méthode pour qu'elle ressemble à:Pour activer ce patch de singe, exécutez py.test comme suit:
Stderr mais pas stdout seront désormais capturés. Nifty!
L'extension du patch de singe ci-dessus au départ de stdout et stderr est laissée au lecteur comme exercice avec un baril plein de temps libre.
la source
Lors de l'exécution du test, utilisez l'
-s
option. Toutes les instructions print dansexampletest.py
seraient imprimées sur la console lorsque le test est exécuté.la source
Selon la documentation de pytest , la version 3 de pytest peut désactiver temporairement la capture dans un test:
la source
pytest capture la sortie standard des tests individuels et ne les affiche qu'à certaines conditions, ainsi que le résumé des tests qu'elle imprime par défaut.
Des informations récapitulatives supplémentaires peuvent être affichées en utilisant l'option '-r':
montre la sortie capturée des tests réussis.
affiche la sortie capturée des tests ayant échoué (comportement par défaut).
Le formatage de la sortie est plus joli avec -r qu'avec -s.
la source
Essayez
pytest -s -v test_login.py
pour plus d'informations dans la console.-v
c'est un court--verbose
-s
signifie «désactiver toutes les captures»la source
Si vous utilisez PyCharm IDE, vous pouvez exécuter ce test individuel ou tous les tests à l'aide de la barre d'outils Exécuter. La fenêtre de l'outil Exécuter affiche la sortie générée par votre application et vous pouvez y voir toutes les instructions d'impression dans le cadre de la sortie de test.
la source
pytest --capture=tee-sys
a été récemment ajouté. Vous pouvez capturer ainsi que voir la sortie sur stdout / err.la source
Les autres réponses ne fonctionnent pas. La seule façon de voir la sortie capturée est d'utiliser l'indicateur suivant:
la source
--show-capture=all
est la valeur par défaut. L'ajouter n'a aucun effet.