Home / LinuxUser / 2008 / 12 / Check inklusive

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

War doch klar...
(241 Punkte bei 17 Stimmen)
Re: War doch klar...
(178 Punkte bei 7 Stimmen)
Re: Skype für 64-Bit-Prozessor u. Suse 12.1
(161 Punkte bei 4 Stimmen)
Kubuntu verliert Finanzierung
(130 Punkte bei 4 Stimmen)
Offen fürs Geschäft
(80 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Check inklusive

Python-Programme testen mit Doctest

Trickkiste

In der Praxis helfen einige nützliche Funktionen beim Testen. Doctest formatiert die Testergebnisse so, wie es auch der interaktive Interpreter tun würde. Erwartete Zeichenketten verlangen also einfache Anführungszeichen. Es gelten jedoch einige komplexere Regeln, zum Beispiel, falls eine Zeichenkette selbst ein einfaches Anführungszeichen enthält (siehe Kasten "Tipps und Tricks für Doctests", Zeilen 1 bis 4).

Der Kasten "Tipps und Tricks für Doctests" fasst der Übersichtlichkeit halber mehrere Beispiele zusammen. Jede Leerzeile trennt ein Beispiel vom nächsten ab. Alle Zeilen eines Beispiels gehören – analog zu den Beispielen oben – in den Docstring Ihres Codes, den Sie testen möchten oder in eine getrennte Testdatei.

Tipps und Tricks für Doctests

>>> "ohne Apostroph"
'ohne Apostroph'
>>> """Wie geht's?"""
"Wie geht's?"
>>> class A(object): pass
…
>>> A()
<__main__.A object at 0x8388b0c>
>>> class A(object): pass
…
>>> A()  #doctest: +ELLIPSIS
<__main__.A object at 0x…>
>>> range(1000)  #doctest: +ELLIPSIS
[0, 1, 2, 3, …, 997, 998, 999]
>>> list(1)  #doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
  …
TypeError: 'int' object is not iterable
>>> range(20)  #doctest: +NORMALIZE_WHITESPACE
[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> print "a\n\nb"
a
<BLANKLINE>
b
>>> vorwahlen
{'Hannover': '0511', 'Berlin': '030'}
>>> d = gib_mir_ein_dictionary()
>>> d == {'Hannover': "0511", 'Berlin': "030"}
True
>>> d = {}
>>> mach_was_mit(d)
>>> d['Berlin']
'030'
>>> 1./13
0.076923076923076927
>>> round(1./13, 6)  # immer noch fehleranfaellig
0.076923000000000005
>>> print round(1./13, 6)  # viel besser
0.076923
>>> daten = erzeuge_daten()
>>> daten  #doctest: +ELLIPSIS
'\x7fELF\x01\x01\x01\x00\x00\x00…\x01\x00\x00\x00\x00\x00\x00\x00'
>>> import md5
>>> md5.new(daten).hexdigest()
'f58860f27dd2673111083770c9445099'

Für einige Situationen bietet das Doctest-Modul Optionen, die Sie an die zu testenden Befehle anhängen [5]. Vor den eigentlichen Optionen steht #doctest: als einleitender String, mehrere Optionsangaben trennen Sie durch Kommas ab. Manchmal tauchen in der Ausgabe eines Tests Bestandteile auf, die sich von einem Testlauf zum nächsten ändern (Zeilen 6 bis 9). Die Adresse in den spitzen Klammern wechselt bei jedem Aufruf. Für einen dennoch konstant funktionierenden Test verwenden Sie den Zusatz ELLIPSIS und kennzeichnen den variablen Teil durch drei Punkte (Zeilen 11 bis 14).

Diese Option hilft Ihnen auch, Schreibarbeit zu sparen (Zeilen 16 und 17). Achten Sie aber darauf, nicht etwa für den Test relevante Teile auszublenden.

Mitunter wechseln von einer Python-Version zur anderen die Fehlermeldungen, die in einer Exception-Ausgabe auftauchen. Zum Beispiel führt die Anweisung list(1) unter Python 2.4 zur Meldung TypeError: iteration over non-sequence, unter Python 2.5 gibt der Interpreter jedoch TypeError: 'int' object is not iterable aus. Solche Unterschiede zwischen Fehlermeldungen dürfen Sie wie in den Zeilen 19 bis 22 mit der Option IGNORE_EXCEPTION_DETAIL vernachlässigen. Der Typ der Ausnahme (hier TypeError) muss nach wie vor stimmen.

Die Option NORMALIZE_WHITESPACE normalisiert Leerraum (Whitespace) in der tatsächlich erzeugten und der erwarteten Ausgabe. Folgen von Leerraum-Zeichen mutieren also zu einzelnen Leerzeichen, was es Ihnen ermöglicht, Ausgaben auf mehrere Zeilen aufzuteilen und zusätzliche Leerzeichen einzufügen (Zeilen 24 bis 26).

Normalerweise sieht Doctest Leerzeilen als Ende eines Tests an. Sind in der Ausgabe echte Leerzeilen zu erwarten, hilft der String <BLANKLINE> in der zu erwartenden Ausgabe. Ohne diese Zeichenkette würde das Doctest-Modul nur die Zeile mit dem a erwarten, was sie mit der Zeichenkette <BLANKLINE> umgehen (Zeilen 28 bis 31). Hier brauchen Sie keine Doctest-Option anzugeben.

Denken Sie daran, dass die Schlüssel/Wert-Paare in Dictionarys keine feste Reihenfolge haben. Ein Test wie in den Zeilen 33 und 34 birgt also die Gefahr eines Fehlers, weil unter Umständen die Reihenfolge in der Ausgabe von Fall zu Fall variiert. Als Test bietet sich in diesem Fall an, das Ergebnis-Dictionary mit dem erwarteten zu vergleichen, siehe Zeilen 36 bis 38. Interessieren Sie dagegen nur bestimmte Einträge, prüfen Sie diese direkt (Zeilen 40 bis 43).

Fließkommazahlen erscheinen je nach Betriebssystem und Bibliotheksversionen unterschiedlich formatiert. Wenn auf Ihrem System der Test in den Zeilen 45 und 46 funktioniert, kann er dennoch auf einem anderen System schiefgehen. Verwenden Sie in diesem Fall die Funktion round in Verbindung mit einer print-Anweisung, um die Ausgaben auf verschiedenen Rechnern zu vereinheitlichen (Zeilen 48 bis 51).

Binärdaten vergleichen Sie bequem auch ohne einen langen Bytestring zu schreiben. Eine Möglichkeit besteht im Gebrauch der Option ELLIPSIS, eine andere im Erzeugen einer Prüfsumme. Die Zeilen 53 bis 58 zeigen beide Varianten.

Ab Python-Version 2.5 empfiehlt es sich, statt des Moduls md5 das Modul hashlib zu verwenden.

Fazit

Mit dem Doctest-Modul bringen Sie Tests auf elegante Art in den Docstrings von Modulen, Funktionen, Klassen und Methoden unter. Ausführlichere Tests lagern Sie besser bis auf grundlegende Anwendungsbeispiele in Textdateien aus. Doctest erweist sich als sehr vielseitig: Mit einigen Tricks nutzen Sie es auch in Fällen, in denen Sie es auf den ersten Blick nicht erwarten würden.

Und zum Schluss noch ein Rat: Schreiben Sie am besten die Tests vor den Funktionen, die Sie prüfen möchten – Stichwort "Testgetriebene Softwareentwicklung". Viel Spass beim Testen!

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 137 Punkte (8 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 03/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Duden Korrektor unter 64-Bit
Duden Korrektor unter 64-Bit
Tim Schürmann, 06.02.2012 10:36, 0 Kommentare

Der Duden Korrektor bietet eine äußerst nützliche Rechtschreib- und Grammatikkorrektur für LibreOffice und bringt in der aktuellen Version 8 e...

Aktuelle Fragen

Ubuntu 11.10 Compiz 3D Cube flackern
Moritz Obenauer, 12.02.2012 12:25, 0 Antworten
Hallo! Ich habe Ubuntu 11.10 mit Unity und den Compiz 3D Cube ein gerichtet. Er funktioniert...
Suse 12.1 Bootvorgang bleibt seit Update stehen
Wimpy *, 12.02.2012 09:22, 3 Antworten
Seit Update auf Kernel 3.1.9-1.4-desktop i686 bleibt der Bootvorgang stehen. Es erscheint der gr...
N24 Stick (Huawei E173) und Ubuntu 11.04
Patrick Obenauer, 11.02.2012 11:54, 1 Antworten
Hallo zusammen! Ich benutze einen alten Laptop, der mit Ubuntu 11.04 flott und problemlos läuft....
Wie kann man beim Einsatz von Compiz die Fenster-Dekoration einstellen?
GoaSkin , 10.02.2012 20:12, 0 Antworten
Hallo, ich nutze Linux Mint mit dem Gnome-Derivat Mate. Da die Distribution Compiz nicht autom...
rndc reload zone - failed bad zone
Ludwig jun. B., 06.02.2012 16:08, 2 Antworten
Schönen guten Tag, ich habe folgendes Problem. Immer wenn ich folgendes Kommando ausführen bek...