691
25.4
Klassen testen mit doctest
#5: Die Liste items wird absteigend nach der Anzahl der Voten sortiert und repräsentiert
dann eine Rangliste. Das heißt, das Paar
(n, wort) mit dem größten n steht ganz vorne.
#6: top ist ein Slice der Liste items mit den ersten n Elementen (Indizes von 0 bis n-1). Falls
die Liste weniger als
n Elemente besitzt, enthält top alle Elemente der Liste. Es gibt in die-
sem Fall keinen Laufzeitfehler, weil die Liste zu kurz ist.
#7: In den folgenden Zeilen wird ein HTML-Text aus n Zeilen generiert, der die n am häu-
figsten vorgeschlagenen Wörter und jeweiligen Voting-Zahlen wiedergibt. (Falls bisher
weniger als
n verschiedene Wörter vorgeschlagen worden sind, fällt das Ergebnis entspre-
chend kürzer aus.)
#8: Die Methode liefert den Rang des Wortes word in der Rangliste aller vorgeschlagenen
Worte.
#9: Hier wird eine Liste namens vote_list erzeugt, die die Anzahlen enthält, wie oft ins-
gesamt jeweils ein bestimmtes Wort vorgeschlagen worden ist. Diese wird anschließend
sortiert und umgekehrt.
#10: Die Variable votes enthält die Häufigkeit, mit der word als »Wort des Jahres« vorge-
schlagen worden ist. Nun wird in der Liste
vote_list gesucht, an welcher Stelle diese Häu-
figkeit vorkommt. Der Index des ersten Vorkommens um eins erhöht (weil die Indizierung
mit
0 beginnt) ist der Rang des Wortes.
#11: Wenn das Modul direkt ausgeführt wird (und nur dann), wird doctest.testmod() auf-
gerufen und der Docstring zu Beginn ausgewertet.
25.4 Klassen testen mit doctest
Wir nehmen nun den Docstring des soeben beschriebenen Moduls ranking als Beispiel,
um weitere Techniken des Testens mit
doctest.testmod() anzusprechen.
25.4.1 Wie testet man eine Klasse?
Letztlich will man die Funktionalität von Methoden testen. Man will sicherstellen, dass sie
das tun, was sie tun sollen. Es gibt jedoch einen Unterschied gegenüber Funktionen: Metho-
den greifen auf den internen Zustand des Objektes zu. Bevor Sie eine Methode testen kön-
nen, müssen Sie zuerst ein Objekt generieren und mit Daten füllen. Es macht deshalb meist
wenig Sinn, in die Docstrings der Methoden Testaufrufe einzutragen. Besser ist es, zu einer
Klasse (unterhalb des Definitionskopfes) oder – wie im Beispiel – zum gesamten Modul
einen Docstring zu schreiben. Dieser enthält dann eine Folge von Methodenaufrufen in
einem sinnvollen Zusammenhang. Im Beispiel beginnt die Testreihe mit der Instanziierung
eines Objektes der Klasse
Ranking, in das mehrere Wörter mithilfe der Methode add() ein-
gefügt werden (
#A). Nun haben wir ein Objekt, an das wir testweise Botschaften schicken
können.
Objektattribute, die getestet werden, müssen öffentlich sein. Das ist vielleicht eine kleine
Schwäche der
doctest-Philosophie. Im Beispiel der Klasse Ranking wäre es zur Wahrung
des Geheimnisprinzips eigentlich besser, wenn die Attribute
voting und filename privat
wären. Wir haben sie öffentlich gemacht, um sie in Tests direkt prüfen zu können.

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.