Testing Warnungen mit doctest

8

Ich möchte doctests verwenden, um das Vorhandensein bestimmter Warnungen zu testen. Angenommen, ich habe das folgende Modul:

%Vor%

Wenn ich python -m doctest testdocs.py ausführe, um den doctest in meiner Klasse auszuführen und sicherzustellen, dass die Warnung gedruckt wird, bekomme ich:

%Vor%

Es sieht so aus, als ob die Warnung gedruckt, aber nicht von doctest erfasst oder bemerkt wird. Ich nehme an, dass dies daran liegt, dass Warnungen in sys.stderr statt in sys.stdout gedruckt werden. Aber das passiert auch, wenn ich am Ende meines Moduls sys.stderr = sys.stdout sage.

Gibt es also eine Möglichkeit, Doctests zu verwenden, um nach Warnungen zu suchen? In der Dokumentation oder in meiner Google-Suche kann ich diese eine oder andere Weise nicht erwähnen.

    
Eli Courtwright 10.03.2010, 16:24
quelle

6 Antworten

4

Dies ist nicht der eleganteste Weg, aber es funktioniert für mich:

%Vor%

Dies funktioniert jedoch vermutlich nicht unter Windows, da der in der UserWarning-Ausgabe gemeldete Pfad mit einem Schrägstrich beginnen muss, wie ich diesen Test geschrieben habe. Sie können vielleicht eine bessere Beschwörung der ELLIPSIS-Direktive herausfinden, aber ich konnte nicht.

    
Will McCutchen 19.03.2010, 16:52
quelle
3

Die Testing Warnings Abschnitte der Python-Dokumentation sind diesem Thema gewidmet. Zusammenfassend haben Sie zwei Möglichkeiten:

(A) Verwenden Sie den catch_warnings -Kontextmanager

Dies wird natürlich in der offiziellen Dokumentation empfohlen. Der catch_warnings -Kontextmanager wurde jedoch erst mit Python 2.6 eingeführt.

%Vor%

(B) Aktualisieren Sie Warnungen auf Fehler

Wenn die Warnung noch nicht angezeigt wurde und somit in der Warnungsregistrierung registriert wurde, können Sie Warnungen festlegen, um Ausnahmen auszulösen und sie abzufangen.

%Vor%     
Scott Robinson 20.03.2010 20:39
quelle
1

Das Problem, dem Sie gegenüberstehen, ist, dass warnings.warn() warnings.showwarning() aufruft, das das Ergebnis von warnings.formatwarning() in eine Datei schreibt, die standardmäßig auf sys.stderr steht.

(Siehe: Ссылка )

Wenn Sie Python 2.6 verwenden, können Sie den warnings.catch_warnings() -Kontextmanager verwenden, um einfach zu ändern, wie Warnungen gehandhabt werden, einschließlich der temporären Ersetzung der Implementierung von warnings.showwarning() , um stattdessen in sys.stdout zu schreiben. Das wäre der richtige Weg, um so etwas zu handhaben.

(Siehe: Ссылка )

Wenn Sie einen schnellen und schmutzigen Hack wollen, werfen Sie einen Dekorateur zusammen, der sys.stderr zu sys.stdout :

umleitet %Vor%

Dann können Sie eine dekorierte Funktion in Ihrem Doctest aufrufen:

%Vor%

Was passiert:

%Vor%     
Callahad 19.03.2010 16:44
quelle
0

docs schlagen vor, dass Sie -Wd weitergeben können, wenn Sie doctest immer ausführen Warnungen.

    
SilentGhost 10.03.2010 16:39
quelle
0

Vielleicht könntest du Mocking (Patch-Print!) das lästige bisschen ausprobieren. Ich gebe zu, das würde dem Docstring etwas Krempel hinzufügen, aber es könnte sich lohnen.

Wenn Sie diesen Ansatz unter Beibehaltung der aktuellen Syntax verwenden möchten, könnten Sie vielleicht versuchen, einen benutzerdefinierten Wrapper für doctest zu implementieren, der den fehlenden Code generiert und dann die festgelegten Tests ausführt. Wenn möglich, ist das wahrscheinlich am besten zu vermeiden.

Alternativ könntest du auch einen ganz eigenen Doctest-Läufer aufstellen, aber ich nehme an, du würdest das lieber vermeiden. :)

    
Juho Vepsäläinen 19.03.2010 08:15
quelle
0

Dies ist ein Beispiel dafür, warum Testverfahren nicht für alle Tests geeignet sind. Wenn Sie Inline-Beispiele in Ihren Docstrings haben und getestet werden müssen, ist das eine Sache, aber Sie haben festgestellt, dass es Verhaltensweisen gibt, die Sie testen möchten, die nicht am besten mit dem String-Matching durchgeführt werden. Und Fälle, in denen Sie den Docstring nicht mit allen Testmechanismen überladen müssen.

    
keturn 21.03.2010 19:16
quelle

Tags und Links