Manchmal möchte ich einfach einige Druckanweisungen in meinen Code einfügen und sehen, was ausgedruckt wird, wenn ich es ausübe. Meine übliche Art, es zu "trainieren", ist mit bestehenden Pytest-Tests. Aber wenn ich diese ausführe, sehe ich anscheinend keine Standardausgabe (zumindest nicht in PyCharm, meiner IDE).
Gibt es eine einfache Möglichkeit, die Standardausgabe während eines Pytest-Laufs anzuzeigen?
Antworten:
Der
-s
Switch deaktiviert die Erfassung pro Test.quelle
-s
=--capture=no
In einem upvoted Kommentar auf die akzeptierte Antwort , Joe fragt:
Unter UNIX wird dies üblicherweise als Abschlag bezeichnet . Im Idealfall ist das Abschlagen und nicht das Erfassen die Standardeinstellung von py.test. Nicht ideal, weder py.test noch ein bestehendes Fremd py.test Plugin (... , die ich kenne, sowieso ) unterstützt Abschläge - trotz Python triviale Weise unterstützt teeing out-of-the-box .
Das Affen-Patchen von py.test, um etwas zu tun , das nicht unterstützt wird, ist nicht trivial. Warum? Weil:
_pytest
Paket nicht beabsichtigt extern importiert werden. Der Versuch, dies zu tun, ohne zu wissen, was Sie tun, führt normalerweise dazu, dass das öffentlichepytest
Paket zur Laufzeit unklare Ausnahmen auslöst. Vielen Dank, py.test. Wirklich robuste Architektur, die Sie dort haben._pytest
auf sichere Weise API, haben Sie , dies zu tun , bevor die Öffentlichkeit laufenpytest
Paket Lauf durch den externenpy.test
Befehl. Das kannst du nicht in einem Plugin tun (z. B. einemconftest
Modul der obersten Ebene in Ihrer Testsuite). Bis py.test träge dazu kommt, Ihr Plugin dynamisch zu importieren, ist jede py.test-Klasse, die Sie mit Affen-Patches versehen wollten, längst instanziiert - und Sie befehlen dies nicht Zugriff auf diese Instanz. Dies bedeutet, dass Sie den externen Befehl nicht mehr sicher ausführen können, wenn Sie möchten, dass Ihr Affen-Patch sinnvoll angewendet wird . Stattdessen müssen Sie die Ausführung dieses Befehls mit benutzerdefinierten Setuptools abschließen (in der Reihenfolge):py.test
test
_pytest
API.pytest.main()
Funktion auf, um denpy.test
Befehl auszuführen .Diese Antwort monkey-patches py.test's
-s
und--capture=no
Optionen zum Erfassen von stderr aber nicht stdout. Standardmäßig erfassen diese Optionen weder stderr noch stdout. Das ist natürlich nicht ganz so. Aber jede große Reise beginnt mit einem langwierigen Prequel, das jeder in fünf Jahren vergisst.Warum das? Ich werde es dir jetzt sagen. Meine py.test-gesteuerte Testsuite enthält langsame Funktionstests. Das Anzeigen des Standardwerts dieser Tests ist hilfreich und beruhigend und verhindert, dass Leycec
killall -9 py.test
nach etwas greift , wenn ein weiterer lang laufender Funktionstest wochenlang nichts tut. Das Anzeigen des stderr dieser Tests verhindert jedoch, dass py.test Ausnahme-Tracebacks bei Testfehlern meldet. Welches ist völlig nicht hilfreich. Daher zwingen wir py.test, stderr aber zu erfassen nicht stdout.Bevor wir dazu kommen, wird in dieser Antwort davon ausgegangen, dass Sie bereits einen benutzerdefinierten
test
Befehl setuptools haben, der py.test aufruft. Wenn Sie dies nicht tun, lesen Sie den Unterabschnitt Manuelle Integration der gut geschriebenen Good Practices von py.test Seite.Installieren Sie keinen Pytest-Runner , ein Setuptools-Plugin eines Drittanbieters, das einen benutzerdefinierten setuptools-
test
Befehl bereitstellt und auch py.test aufruft. Wenn pytest-running bereits installiert ist, müssen Sie wahrscheinlich dieses pip3-Paket deinstallieren und dann den oben verlinkten manuellen Ansatz anwenden.Angenommen, Sie haben die oben hervorgehobenen Anweisungen in der manuellen Integration befolgt , sollte Ihre Codebasis jetzt eine
PyTest.run_tests()
Methode enthalten . Ändern Sie diese Methode so, dass sie ähnelt:Führen Sie py.test wie folgt aus, um diesen Affen-Patch zu aktivieren:
Stderr aber nicht stdout wird jetzt erfasst. Raffiniert!
Das Erweitern des obigen Affenfeldes auf Tee-Stdout und Stderr bleibt dem Leser als Übung mit einem Fass voller Freizeit.
quelle
Verwenden Sie beim Ausführen des Tests die
-s
Option. Alle print-Anweisungen in werdenexampletest.py
auf der Konsole gedruckt, wenn der Test ausgeführt wird.quelle
Laut Pytest-Dokumentation kann Version 3 von Pytest die Erfassung in einem Test vorübergehend deaktivieren:
quelle
pytest erfasst den Standard aus einzelnen Tests und zeigt ihn nur unter bestimmten Bedingungen zusammen mit der Zusammenfassung der Tests an, die standardmäßig gedruckt werden.
Zusätzliche zusammenfassende Informationen können mit der Option '-r' angezeigt werden:
zeigt die erfasste Ausgabe der bestandenen Tests.
Zeigt die erfasste Ausgabe fehlgeschlagener Tests an (Standardverhalten).
Die Formatierung der Ausgabe ist mit -r schöner als mit -s.
quelle
Versuchen Sie
pytest -s -v test_login.py
für weitere Informationen in der Konsole.-v
es ist kurz--verbose
-s
bedeutet "Alle Erfassungen deaktivieren"quelle
Wenn Sie PyCharm IDE verwenden, können Sie diesen einzelnen Test oder alle Tests über die Symbolleiste Ausführen ausführen. Das Fenster "Ausführen" zeigt die von Ihrer Anwendung generierte Ausgabe an, und Sie können alle darin enthaltenen Druckanweisungen als Teil der Testausgabe anzeigen.
quelle
pytest --capture=tee-sys
wurde kürzlich hinzugefügt. Sie können die Ausgabe auf stdout / err erfassen und anzeigen.quelle
Die anderen Antworten funktionieren nicht. Die einzige Möglichkeit, die erfasste Ausgabe anzuzeigen, ist die Verwendung des folgenden Flags:
quelle
--show-capture=all
ist der Standardwert. Das Hinzufügen hat keine Auswirkungen.