J'essaye d'utiliser TDD (développement piloté par les tests) avec pytest
.
pytest
ne sera pas print
à la console lorsque je l'utilise print
.
J'utilise pytest my_tests.py
pour l'exécuter.
Le documentation
semble dire que cela devrait fonctionner par défaut: http://pytest.org/latest/capture.html
Mais:
import myapplication as tum
class TestBlogger:
@classmethod
def setup_class(self):
self.user = "alice"
self.b = tum.Blogger(self.user)
print "This should be printed, but it won't be!"
def test_inherit(self):
assert issubclass(tum.Blogger, tum.Site)
links = self.b.get_links(posts)
print len(links) # This won't print either.
Rien n'est imprimé sur ma console de sortie standard (juste la progression normale et le nombre de tests réussis / échoués).
Et le script que je teste contient print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
Dans le unittest
module, tout est imprimé par défaut, ce qui est exactement ce dont j'ai besoin. Cependant, je souhaite utiliser pytest
pour d'autres raisons.
Quelqu'un sait-il comment afficher les instructions d'impression?
python
unit-testing
python-2.7
pytest
BBModifier
la source
la source
sys.stdout.write("Test")
? Et pourquoi passys.__stdout__.write("Test")
? Ce dernier devrait toujours écrire dans la sortie standard définie par le système, qui devrait être la console. Si les deux commandes font des choses différentes, alors stdout est modifié; s'ils font la même chose, alors le problème est autre chose.Réponses:
Par défaut,
py.test
capture le résultat de la sortie standard afin qu'il puisse contrôler la façon dont il l'imprime. S'il ne le faisait pas, il vomirait beaucoup de texte sans le contexte de quel test imprimait ce texte.Cependant, si un test échoue, il inclura une section dans le rapport résultant qui montre ce qui a été imprimé selon la norme dans ce test particulier.
Par exemple,
Résultats dans la sortie suivante:
Notez la
Captured stdout
section.Si vous souhaitez voir les
print
instructions lors de leur exécution, vous pouvez passer l'-s
indicateur àpy.test
. Cependant, notez que cela peut parfois être difficile à analyser.la source
L'utilisation de l'
-s
option imprimera la sortie de toutes les fonctions, ce qui peut être trop.Si vous avez besoin d'une sortie particulière, la page de documentation que vous avez mentionnée propose quelques suggestions:
Insérez
assert False, "dumb assert to make PyTest print my stuff"
à la fin de votre fonction, et vous verrez votre sortie en raison d'un test échoué.Vous avez un objet spécial qui vous est passé par PyTest, et vous pouvez écrire la sortie dans un fichier pour l'inspecter plus tard, comme
Vous pouvez ouvrir les fichiers
out
eterr
dans un onglet séparé et laisser l'éditeur l'actualiser automatiquement pour vous, oupy.test; cat out.txt
exécuter une simple commande shell pour exécuter votre test.C'est une façon plutôt hackeuse de faire des choses, mais c'est peut-être ce dont vous avez besoin: après tout, TDD signifie que vous vous embêtez et que vous le laissez propre et silencieux quand il est prêt :-).
la source
print()
fonction, vous devez mettre la variable ou le message que vous souhaitez imprimer après la virgule dans l'instruction assert. Par exempleassert False, what_are_you
, «imprimera» la valeur dewhat_are_you
dans le rapport pytest.Réponse courte
Utilisez l'
-s
option:Réponse détaillée
À partir de la documentation :
pytest
a l'option--capture=method
dans laquellemethod
est par test méthode de capture, et pourrait être l' une des suivantes:fd
,sys
ouno
.pytest
a également l'option-s
qui est un raccourci pour--capture=no
, et c'est l'option qui vous permettra de voir vos instructions d'impression dans la console.Définition des méthodes de capture ou désactivation de la capture
Il existe deux manières d'
pytest
effectuer la capture:capture de niveau descripteur de fichier (FD) (par défaut): toutes les écritures aller au fichier du système d'exploitation descripteurs 1 et 2 sera capturé.
Capture au niveau sys : Seules les écritures dans les fichiers Python sys.stdout et sys.stderr seront capturées. Aucune capture d'écritures sur les descripteurs de fichiers n'est effectuée.
la source
Je avais besoin d'imprimer Avertissement important sur les tests sautées exactement quand
PyTest
coupé littéralement tout .Je ne voulais pas échouer un test pour envoyer un signal, alors j'ai fait un hack comme suit:
Le
atexit
module me permet d'imprimer des trucs après avoirPyTest
publié les flux de sortie. La sortie ressemble à ceci:Le message est imprimé même
PyTest
en mode silencieux, et n'est pas imprimé si vous exécutez des trucs avecpy.test -s
, donc tout est déjà bien testé.la source
Selon la documentation pytest ,
pytest --capture=sys
devrait fonctionner. Si vous souhaitez capturer le standard à l'intérieur d'un test, reportez-vous à l'appareil capsys.la source
À l'origine, je suis venu ici pour trouver comment
PyTest
imprimer dans la console de VSCode tout en exécutant / déboguant le test unitaire à partir de là. Cela peut être fait avec lalaunch.json
configuration suivante . Compte tenu.venv
du dossier de l'environnement virtuel.la source