Ich versuche, TDD (testgetriebene Entwicklung) mit zu verwenden pytest
.
pytest
werde nicht print
zur Konsole, wenn ich benutze print
.
Ich benutze es pytest my_tests.py
, um es auszuführen.
Das documentation
scheint zu sagen, dass es standardmäßig funktionieren sollte: http://pytest.org/latest/capture.html
Aber:
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.
Auf meiner Standardausgabekonsole wird nichts gedruckt (nur der normale Fortschritt und wie viele Tests bestanden / fehlgeschlagen sind).
Und das Skript, das ich teste, enthält print:
class Blogger(Site):
get_links(self, posts):
print len(posts) # It won't get printed in the test.
Im unittest
Modul wird standardmäßig alles gedruckt, genau das, was ich brauche. Ich möchte jedoch pytest
aus anderen Gründen verwenden.
Weiß jemand, wie die Druckanweisungen angezeigt werden?
python
unit-testing
python-2.7
pytest
BBedit
quelle
quelle
sys.stdout.write("Test")
? Wie wäre essys.__stdout__.write("Test")
? Letzterer sollte immer in das systemdefinierte Standardout schreiben, das die Konsole sein sollte. Wenn die beiden Befehle unterschiedliche Aktionen ausführen, wird stdout geändert. Wenn sie dasselbe tun, ist das Problem etwas anderes.Antworten:
Erfasst standardmäßig
py.test
das Ergebnis des Standardausgangs, damit es steuern kann, wie es ausgedruckt wird. Wenn dies nicht der Fall wäre, würde es viel Text ausspucken, ohne den Kontext, in dem dieser Test diesen Text gedruckt hat.Wenn ein Test jedoch fehlschlägt, enthält er einen Abschnitt im resultierenden Bericht, der zeigt, was in diesem bestimmten Test als Standard gedruckt wurde.
Beispielsweise,
Ergebnisse in der folgenden Ausgabe:
Beachten Sie den
Captured stdout
Abschnitt.Wenn Sie
print
Anweisungen sehen möchten, während sie ausgeführt werden, können Sie das-s
Flag an übergebenpy.test
. Beachten Sie jedoch, dass dies manchmal schwierig zu analysieren ist.quelle
Mit der
-s
Option wird die Ausgabe aller Funktionen gedruckt, die möglicherweise zu viel sind.Wenn Sie eine bestimmte Ausgabe benötigen, bietet die von Ihnen erwähnte Dokumentseite einige Vorschläge:
Fügen Sie
assert False, "dumb assert to make PyTest print my stuff"
am Ende Ihrer Funktion ein, und Sie sehen Ihre Ausgabe aufgrund eines fehlgeschlagenen Tests.Sie haben ein spezielles Objekt von PyTest an Sie übergeben, und Sie können die Ausgabe in eine Datei schreiben, um sie später zu überprüfen
Sie können die Dateien
out
underr
in einer separaten Registerkarte öffnen und vom Editor automatisch für Sie aktualisieren lassen oder einen einfachenpy.test; cat out.txt
Shell-Befehl ausführen, um Ihren Test auszuführen.Das ist eine ziemlich hackige Art, Dinge zu tun, aber vielleicht ist es das, was Sie brauchen: TDD bedeutet schließlich, dass Sie sich mit Dingen anlegen und sie sauber und leise lassen, wenn sie fertig sind :-).
quelle
print()
Funktion zu verwenden, sollten Sie die Variable oder Nachricht, die Sie drucken möchten , nach dem Komma in die assert-Anweisung einfügen . ZBassert False, what_are_you
wird der Wert vonwhat_are_you
im Pytest-Bericht "ausgedruckt".Kurze Antwort
Verwenden Sie die
-s
Option:Detaillierte Antwort
Aus den Dokumenten :
pytest
hat die Möglichkeit ,--capture=method
in dermethod
pro-Testverfahren ist die Erfassung und könnte einer der folgenden sein:fd
,sys
oderno
.pytest
hat auch die Option, für-s
die es sich um eine Verknüpfung handelt--capture=no
, und mit dieser Option können Sie Ihre Druckanweisungen in der Konsole anzeigen.Festlegen von Erfassungsmethoden oder Deaktivieren der Erfassung
Es gibt zwei Möglichkeiten, die
pytest
Erfassung durchzuführen:Erfassung auf Dateideskriptor-Ebene (FD) (Standard): Alle Schreibvorgänge in die Dateideskriptoren 1 und 2 des Betriebssystems werden erfasst.
Erfassung auf Sys-Ebene : Es werden nur Schreibvorgänge in Python-Dateien sys.stdout und sys.stderr erfasst. Es wird keine Erfassung von Schreibvorgängen an Dateideskriptoren durchgeführt.
quelle
Ich musste wichtige Warnungen über übersprungene Tests genau dann ausdrucken, wenn
PyTest
buchstäblich alles stummgeschaltet war .Ich wollte keinen Test zum Senden eines Signals nicht bestehen, also habe ich einen Hack wie folgt durchgeführt:
Das
atexit
Modul ermöglicht es mir, Dinge zu drucken, nachdemPyTest
die Ausgabestreams freigegeben wurden. Die Ausgabe sieht wie folgt aus:Die Nachricht wird gedruckt, auch wenn sie
PyTest
sich im unbeaufsichtigten Modus befindet, und wird nicht gedruckt, wenn Sie Inhalte ausführenpy.test -s
, sodass bereits alles gut getestet wurde.quelle
Nach der pytest docs ,
pytest --capture=sys
sollte funktionieren. Wenn Sie den Standard in einem Test erfassen möchten, lesen Sie das Capsys-Gerät.quelle
Ich bin ursprünglich hierher gekommen, um herauszufinden, wie man
PyTest
in der VSCode-Konsole druckt, während der Unit-Test von dort aus ausgeführt / debuggt wird. Dies kann mit der folgendenlaunch.json
Konfiguration erfolgen. Gegeben.venv
der Ordner der virtuellen Umgebung.quelle