Wie kann man das Logging Modul in Python mit dem Unittest Modul benutzen?

8

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.

    
user197674 27.07.2010, 19:11
quelle

1 Antwort

1

Sie könnten, aber ich bin mir nicht sicher, dass es Ihre beste Vorgehensweise ist.

Für diesen Ansatz würden Sie:

  1. 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.

  2. Erstellen Sie Ihren eigenen TextTestRunner und initialisieren Sie ihn mit diesem In-Memory-Stream.

  3. 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:

  • Sie haben nicht viel Flexibilität, wenn Sie verschiedene Teile der TextTestRunner-Ausgabe auf verschiedene Protokollebenen lenken.
  • TextTestRunner wird, falls falsch konfiguriert, eine Menge Dinge schreiben, die Sie wahrscheinlich nicht wollen. Die Standard-Ausführlichkeit ist 1, die während des Testens Fortschrittspunkte schreibt ... was wahrscheinlich nur in der Logging-Ausgabe im Weg ist.
  • Wenn Sie dies naiv tun, rufen Sie 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.

    
Owen S. 27.07.2010, 20:29
quelle

Tags und Links