In meinem letzten Blogpost habe ich euch etwas über die Vorzüge von Unittests erzählt und was würde da nicht besser passen als ein Blogpost über die Organisation solcher Tests? Betreibt man TDD (Test driven development) nämlich etwas intensiver dauert es meist nicht lange bis man droht den Überblick zu verlieren. Selbstverständlich gibt es auch hierfür nützliche Tools die einem diese Arbeit erleichtern jedoch nicht vollständig abnehmen, denn eine sinnvolle Strukturierung ist nunmal das A und O und kann nur schwer “mal eben so” der Technik überlassen werden.
In diesem konkreten Fall möchte ich NOSE vorstellen, ein Testing-Framework für und in Python geschrieben: nose.readthedocs.org

NOSE kann man ganz einfach über den Python Package Index (pip) oder per easy_install installieren:
pip install nose
Hat man nun seine Tests schön in einzelne Dateien/Verzeichnisse aufgeteilt und innerhalb dieser evtl. sogar noch spezielle Testfälle, kann man einfach mal im Projektordner folgendes Kommando ausführen:
nosetests
Und schon rattert alles mögliche an Tests den Bildschirm herunter. Standardmäßig sucht NOSE im aktuellen Verzeichnis und dessen Unterverzeichnissen nach Tests. Wie das genau funktioniert steht hier, aber am wichtigsten ist:

If it looks like a test, it’s a test.

Das kann man noch ein wenig feiner kontrollieren, indem man NOSE sagt in welchem Verzeichnis es mit der Suche beginnen soll:
nosetests --where="der/pfad/zu/den/tests"
Möchte man das noch weiter spinnen, kann man auch regular expressions, die Modulpfade der Tests und sogar Attribute der Tests angeben. Nähere Infos zu folgenden Argumenten gibts mit –help:

  • –tests=NAMES
  • -a ATTR, –attr=ATTR
  • -A EXPR, –eval-attr=EXPR
  • -I REGEX, –ignore-files=REGEX
  • -e REGEX, –exclude=REGEX
  • -i REGEX, –include=REGEX

Sobald NOSE alle Tests ausführt die ausgeführt werden sollen, möchte man eventuell die Ausgabe ein wenig verändern wie z.B. zusätzliche Informationen anzeigen. Das geht mit den üblichen Verdächtigen:

  • -v
  • -vv
  • -vvv

Die Ausgabe selbst wird allerdings noch in anderer Weise verändert bzw. kann verändert werden, nämlich durch Plugins. NOSE kann durch Plugins eigens erweitert werden wobei es auch einige wirklich praktische Plugins bereits mit im Paket gibt: Batteries included
Sehr praktisch in dieser Hinsicht ist das Capture-Plugin wodurch jedwede Ausgabe die ein Test produziert zuerst zurückgehalten und erst im Fehlerfall nach Abschluss aller anderen Tests angezeigt wird. Wer das nicht möchte bzw. mit pdb bereits während eines Tests den Fehlerfall inspizieren möchte kann folgendes Argument benutzen:
nosetests -s
Doch so richtig praktisch wirds m.E. erst mit dem coverage skript von Ned. Das kann man, sobald es installiert ist, direkt zusammen mit den Tests ausführen lassen:

  • –with-coverage
  • –cover-min-percentage=COVER_MIN_PERCENTAGE
  • –cover-html

Wenn dann alle Tests ausgeführt, währenddessen genug Informationen angezeigt und im Nachhinein sauber alle abgedeckten Anweisungen aufgeführt werden kann man sich wieder voll und ganz auf das schreiben der eigentlichen Tests konzentrieren. 😀

Johannes Meyer
Johannes Meyer
Developer

Johannes ist seit 2011 bei uns und hilft bei der Entwicklung zukünftiger Knüller (Icinga2, Icinga Web 2, ...) aus dem Hause NETWAYS.