697
25.5
Gestaltung von Testreihen mit unittest
Die Klasse TextTestRunner
Der letzte Schritt auf dem Weg zur Testumgebung ist die Erzeugung eines Testrunners. Ein
Testrunner kontrolliert die Ausführung der Tests und produziert einen Testbericht. Mit den
Klassen des Moduls
unittest kann man eigene komfortable Testrunner (z.B. mit grafi-
scher Oberfläche) entwickeln. Das Modul
unittest beinhaltet aber bereits eine vorgefer-
tigte Testrunner-Klasse namens
TextTestRunner.
Bei der Instanziierung eines
TextTestRunner-Objektes können Sie mit einem Schlüssel-
wort-Argument die Ausführlichkeit des Testberichtes einstellen. Default ist
verbosity=1.
Sie können den Konstruktor ohne Argument aufrufen
Dann erwähnt der Testbericht nur dann einen Testfall, wenn ein Fehler aufgetreten ist.
Wenn Sie für die Ausführlichkeit einen höheren Wert als
1 einstellen, wird auch bei fehler-
freien Testläufen jeder Testfall aufgeführt.
Wenn Sie Ihr Skript über IDLE ausführen, erscheint der Testbericht in roter Schrift. Das
liegt daran, dass als Ausgabekanal
sys.stderr voreingestellt ist. Durch Setzen der Option
stream können Sie die Ausgabe auf ein anderes Pyseudofile wie z.B. die Standardausgabe
sys.stdout umleiten.
Ein
TextTestRunner-Objekt wird durch Aufruf der run()-Methode gestartet. Als Argu-
ment wird ein
TestSuite-Objekt übergeben.
25.5.3 Weiterführendes Beispiel
Wir entwickeln nun für die Klasse Ranking aus Abschnitt 25.3 eine Testreihe mit vier Test-
fällen, die in zwei
TestCase-Unterklassen definiert sind. Die erste TestCase-Unterklasse
TestRanking1 enthält Funktionstests, die mit einer kleinen überschaubaren Liste von Wör-
tern durchgeführt werden. Es geht darum, sicherzustellen, dass alle Methoden der Klasse
Ranking korrekt arbeiten.
Methode Erläuterung
addTest(test)
gt ein TestCase-Objekt oder ein TestSuite-Objekt test ein.
addTests(tests)
gt eine Sequenz tests von TestCase-Objekten oder
TestSuite-Objekten ein.
Tabelle 25.2: Methoden der Klasse TestSuite zur Aggregation von Testfällen
testrunner = unittest.TextTestRunner()
testrunner = unittest.TextTestRunner(verbosity=2)
testrunner = unittest.TextTestRunner(stream=sys.stdout)
testrunner.run(suite)
Kapitel 25
Testen und Tuning
698
Die zweite TestCase-Unterklasse TestRanking2 enthält einen Belastungstest. Hier soll
geprüft werden, ob das System auch mit sehr großen Datenmengen zurechtkommt, wie sie
im praktischen Einsatz anfallen. Da hier auf andere Weise Testdaten produziert werden müs-
sen, macht es Sinn, eine neue
TestCase-Unterklasse mit einer anderen setUp()-Methode
zu definieren.
Die Testreihe wird mit einem Testrunner der Klasse
TextTestRunner ausgeführt.
Skript:
#rankingtest_fortgeschritten.py
import unittest, os, random, ranking
class TestRanking1 (unittest.TestCase): #1
"""Funktionstests"""
def s etU p (sel f ) : #2
"""Erzeuge Testdaten und Ranking-Objekt """
self.words = ["Titan", "Jupiter", "Titan",
"Titan", "Huygens", "Jupiter"]
self.r = ranking.Ranking("not_existing.txt")
for w in self.words:
self.r.add(w)
self.r.save()
def tearDown(self):
"""Lösche Testdatei """
try:
os.remove("not_existing.txt") #3
except: pass
def t est R ank( s e lf) : #4
"""Prüfe, ob Rang richtig berechnet wird"""
self.failUnless (self.r.getRank("Titan") == 1)
self.failUnless (self.r.getRank("Jupiter") == 2)
self.failUnless (self.r.getRank("Huygens") == 3)
def testSave(self):
""" Pruefe, ob alle Woerter uebernommen wurden"""
r = ranking.Ranking("not_existing.txt")
for w in set(self.words):
self.failUnless (r.voting[w]==self.words.count(w))
699
25.5
Gestaltung von Testreihen mit unittest
def testGetTop(self):
""" Wird das am häufigsten gewählte Wort erkannt?"""
expected = "Titan 3 <br> "
text = self.r.getTop(1)
self.assertEqual(text, expected)
class TestRanking2 (unittest.TestCase): #5
"""Belastungstest"""
def setUp(self):
"""erzeuge Zufallsliste von Wörtern"""
f = open("willkommen.txt", "r") #6
text = f.read()
f.close()
w o r d s = t e xt. s p lit ( ) #7
self. words = [random.choice(words)
f o r i i n ran g e (10 0 0)] #8
def tearDown(self):
"""Lösche Datei, die durch den Test erzeugt worden ist"""
try: os.remove("testfile.txt")
except: pass
def testAdd(self):
"""Belastungstest"""
f o r w i n s elf . w ord s : #9
r = ranking.Ranking("testfile.txt")
r.add(w)
r.save()
for w in set(self.words):
self.failUnless (r.voting[w]==self.words.count(w))
suite = unittest.TestSuite() #10
suite.addTests((TestRanking1("testRank"),
TestRanking1("testSave"),
TestRanking1("testGetTop"),
TestRanking2("testAdd")))
testrunner = unittest.TextTestRunner(verbosity=2) #11
testrunner.run(suite)

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.