Unittest Ausgabe in Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
brodi
User
Beiträge: 3
Registriert: Montag 31. Mai 2010, 14:35

Hallo

Ich teste mit Python über xml rpc einen Webservice.
Die Tests schreib ich wahrscheinlich mit unittest.
Ich brauch aber noch eine Ausgabe des Tests in einem Logfile o.ä.
Folgendes hab ich hingekriegt...

Code: Alles auswählen

import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        self.seq = list(range(10))

    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(10)))

suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
testResult = unittest.TextTestRunner(verbosity=2).run(suite)
Das Beispiel oben gibt mir in der Shell folgende Ausgabe

Code: Alles auswählen

test_shuffle (__main__.TestSequenceFunctions) ... OK
Das benötige ich nun in einem Logfile mit Angabe der Parameter (Soll/Ist) bei Fehlern.
Gibts da einen einfachen Befehl für eine (ähnlich) Ausgabe?
Oder gibt es eine bessere Alternative zu unittest?

Edit:
Das Logfile sollte in etwa so aussehen...

Code: Alles auswählen

Zeitstempel,Funktion,Resultat,Soll,Ist
2010_06_02T13_16_44,test_shuffle,OK
2010_06_02T13_16_47,test_shuffle,ERROR,10,15
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Besseres als `unittest` gibts bestimmt, und das `unittest`-Modul kann bestimmt seine Ausgabe in eine Datei speichern, aber warum nicht einfach

Code: Alles auswählen

./deine/tests.py > testlog
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die Ausgabe geht nach stderr, nicht stdout. Daher sollte man besser `test.py >out 2>&1` benutzen.

Statt sich suite und testResult selbst zu besorgen, kann man übrigens auch einfach folgendes schreiben:

Code: Alles auswählen

if __name__ == '__main__':
    unittest.main()
Doch wenn schon, dann kann man die Ausgabe so umlenken:

Code: Alles auswählen

unittest.TextTestRunner(stream=open("output", "w")).run(suite)
Ich würde allerdings immer die Umlenkung per Shell vorziehen, denn wer weiß, ob nicht auch Testfälle sich noch genötigt fühlen, per "print" oder sonstwie etwas auszugeben, das ich ebenfalls in der Log Datei vorfinden will.

Stefan
Antworten