693
25.5
Gestaltung von Testreihen mit unittest
Damit Ellipsen verarbeitet werden können, muss die Direktive +ELLIPSIS gesetzt werden.
Im Beispiel
#E wird geprüft, ob der zurückgegebene String mit der Zeichenfolge Titan 3
beginnt.
25.4.4 Dictionaries testen
Am Ende des Docstrings (#F) testen wir, ob das Attribut r.voting, das ein Dictionary mit
dem Befragungsergebnis enthält, unseren Erwartungen entspricht. Nun gibt es bei Dic-
tionaries folgende Schwierigkeit: Es ist nicht bekannt, in welcher Reihenfolge die Items
angeordnet sind. Deshalb ist z.B. folgender Test nicht geeignet:
Denn in der internen Darstellung des Dictionaries könnten die Items auch in anderer Rei-
henfolge aufgeführt sein. Der Test mit
doctest.testmod() würde dann eine Fehlermel-
dung liefern. Stattdessen prüft man Dictionaries durch einen Vergleich mit dem
Gleichheitsoperator
==. Der Vergleich liefert immer den Wert True, wenn die beiden vergli-
chenen Dictionaries – unabhängig von ihrer internen Repräsentation – gleich sind, also die
gleichen Items enthalten.
25.5 Gestaltung von Testreihen mit unittest
In diesem Abschnitt werden wir noch etwas professioneller. Mithilfe des Python-Moduls
unittest entwickeln wir eine separate Testumgebung für die Klasse Ranking.
Das Modul
unittest ist eine Python-Implementierung des bekannten Test-Frameworks
JUnit, das von Kent Beck und Erich Gamma r die Programmiersprache Java entwickelt
worden ist (
http://www.junit.org/).
Die Philosophie von
unittest fußt auf folgenden vier Konzepten:
Es gibt Maßnahmen zur Vor- und Nachbereitung einer Testreihe (test fixture). Zur Vorbe-
reitung gehört, dass Testdaten bereitgestellt werden. Sofern durch die Testläufe irgend-
etwas am System verändert wurde (z.B. indem Dateien angelegt oder verändert worden
sind), muss dieses nach den Tests wieder rückgängig gemacht werden.
Ein Testfall (test case) ist die kleinste Einheit eines Testarrangements. In einem Testfall
wird zu Beginn eine Menge von Daten erzeugt und dann geprüft, ob diese Daten korrekt
verarbeitet werden.
Eine Testreihe (test suite) ist eine Sammlung von Testfällen.
Ein Testläufer (test runner) ist ein Objekt, das eine Testreihe durchführt und eine benut-
zerfreundliche Ausgabe mit den Testergebnissen produziert.
25.5.1 Einführendes Beispiel mit einem Testfall
Das folgende Skript zeigt bereits alle wichtigen Elemente eines kleinen Testarrangements.
Getestet wird das Einfügen neuer Wörter in ein Objekt der Klasse
Ranking aus dem obigen
Beispiel (Abschnitt 25.3).
>>> r.voting
{'Einstein': 2, 'Methan': 1, 'Titan': 3}
Kapitel 25
Testen und Tuning
694
Skript:
Ausgabe:
Erläuterung:
#1: Wir definieren für unseren Testfall eine Unterklasse der Klasse TestCase aus dem
Modul
unittest.
#2: Die geerbte Methode setup() der Oberklasse unittest.TestCase wird überschrieben.
In der
setup()-Methode werden die Testdaten vorbereitet. Diese Methode wird später auto-
matisch immer vor einer Testroutine ausgeführt.
#3: Erzeugt eine Liste von Wörtern, die später im Test in ein Ranking-Objekt eingefügt wer-
den sollen.
#4: Es wird ein leeres Ranking-Objekt erzeugt. Die Datei mit dem angegebenen Dateina-
men existiert nicht. Deshalb ist das interne Dictionary mit dem Befragungsergebnis
self.voting leer.
# rankingtest.py
import unittest, ranking
class TestRanking (unittest.TestCase): #1
def s etU p (sel f ) : #2
"""Erzeuge Liste von Wörtern und Ranking-Objekt"""
self.words = ["Jupiter", "Titan", "Jupiter"] #3
self.r = ranking.Ranking("not_existing.txt") #4
def t est A dd(s e l f): #5
fo r w in s e lf. w o rds : #6
self.r.add(w)
for word in self.r.voting.keys(): #7
n_voting = self.r.voting[word]
n_words = self.words.count(word)
self.failUnless(n_voting == n_words) #8
suite = unittest.TestSuite() #9
test = TestRanking("testAdd") #10
sui t e .ad d T est ( test ) #11
testrunner = unittest.TextTestRunner(verbosity=2) #12
testrunner.run(suite) #13
testAdd (__main__.TestRanking) ... ok
-------------------------------------------------------
Ran 1 test in 0.027s
OK

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.