Ich möchte das Python-Logging-Modul verwenden, um alle Ausgaben von unittest zu protokollieren, so dass ich es in ein Test-Framework integrieren kann, das ich zu schreiben versuche. Das Ziel besteht darin, die Tests mit zwei Ausgabesätzen auszuführen, einen mit einfacher Ausgabe, der die Testfallschritte angibt, und einen Debug-Level-Output, so dass, wenn etwas schief geht, wir so viele Informationen wie möglich haben. Die Ausgabe würde in zwei Dateien gespeichert werden, eine, die ich an Leute per E-Mail versenden könnte, und eine andere, die im Falle von Fehlern aufbewahrt wird. Ich habe festgestellt, dass der TextTestRunner einen Stream verwenden kann, könnte dies mit dem Logging-Modul verwendet werden? Ich plane, einige der neuen Funktionen in Python 2.7 zu verwenden.
Sie könnten, aber ich bin mir nicht sicher, dass es Ihre beste Vorgehensweise ist.
Für diesen Ansatz würden Sie:
Instanziieren Sie einen In-Memory-Stream, der von TextTestRunner
verwendet werden kann. Das ist die Art von Dingen, für die io.StringIO
nahezu perfekt wäre, außer dass es nur mit Unicode-Eingaben funktioniert und ich bin mir nicht sicher, ob TextTestRunner Unicode korrekt in den Stream schreibt. Ihre andere Möglichkeit wäre, Ihren eigenen In-Memory-Stream zu codieren, der Ihren Zweck erfüllt und vielleicht StringIO
mit einem Encoder umschließt.
Erstellen Sie Ihren eigenen TextTestRunner und initialisieren Sie ihn mit diesem In-Memory-Stream.
Erstellen Sie eine Klasse, die aus dem Stream liest und in das Protokoll schreibt.
Dies könnte so einfach sein wie:
%Vor%Probleme mit diesem Ansatz:
stream_logger.run()
erst dann auf, wenn Sie alle Ihre Ausgaben in den Stream geschrieben haben. So erhalten Sie Ihre Logging-Ausgabe nicht in Echtzeit, und Ihre Logging-Zeitstempel sind nutzlos. Sie könnten dies lösen, indem Sie zum Beispiel einen separaten Thread zum Lesen erstellen, aber dann müssen Sie einen Stream auswählen / rollen, der einen gleichzeitig arbeitenden Reader- und Writer-Thread verarbeiten kann, oder einen Prozess abzweigen und den In-Memory-Stream abzweigen. oder etwas relativ Kompliziertes. Der Ansatz, den ich stattdessen vorschlagen würde, besteht darin, auf Streams zu verzichten und einfach Ihren eigenen Test-Runner zu rollen - genannt LoggingTestRunner - der die Testausgabe genau so in den Logger schreibt, wie Sie es ausgeben wollen. Dadurch können Sie alle drei dieser Probleme vermeiden.
Tags und Links python unit-testing logging