Montag, 7. Juli 2008

py.test: rapid testing with minimal effort

Holger Krekel hat ein 1-stündiges Tutorial gegeben um die Verwendung von py.test zu erläutern.

Übersicht
  • py.test ist projektübergreifend und hält den Test-Tool-Code in einer eigenen Bibliothek
  • sammelt Python-Tests automatisch auf und führt sie aus
  • versucht die Boiler-Plate innerhalb eines Projekts klein zu halten
  • kann projektspezifisch erweitert werden
  • läuft auf Linux, Windows, OSX und unter Python 2.3-2.5
Grundlagen
  • Installation als Egg, stellt "py.test" als Executable zur Verfügung
  • Der "py"-Namensraum hat einen automatischen Lazy-Importer, der alles unterhalb von "py.*" importiert, so dass man nur "py" importieren braucht, der Rest kommt automatisch mit.
  • Tests werden über Konventionen automatisch gefunden (Klasse mit Namen "Test*" und Methoden mit dem Namen test_*) automatisch gefunden.
  • Automatisches Auffinden kann über "--collectonly" nachverfolgt werden
    um zu sehen wie py.test vorgeht und was es tatsächlich sieht und findet.
  • Assertions werden über Python's "assert"-Statement formuliert. Exceptions können über eine Helferfunktion "py.test.raises" mit dem "assert"-Statement kombiniert werden.
  • Fehlerhafte Werte bei einem Fehler werden getraced um zu zeigen wie sie berechnet wurden.
  • Generative Tests: wenn eine Testmethode ein Generator ist, kann sie Callables und deren Parameter yielden, die dann als eigentlicher Test ausgeführt werden.
  • stdout/stderr werden umgeleitet und nur im Fehlerfall ausgegeben
  • --pdb lädt einen pdb nach einem Fehler
  • -x beendet den Testlauf nach dem ersten Fehler
  • --looponfailing: führt die fehlgeschlagenen Tests automatisch neu aus, wenn Dateien, die zu diesen Tests gehören verändert werden
  • setup/teardown: setup_module, setup_class, setup_method, teardown_*
  • setup_method bekommt das Methodenobjekt reingereicht, setup_module erhält das Modul-Objekt, setup_class erhält die Klasse
  • doctests werden anhand der Extension ".txt" automatisch gefunden
Erweiterbarkeit
  • py.test sucht nach "conftest.py"-Dateien, die die Konfiguration von py.test beeinflussen.
  • Mehrere conftest.py-Dateien können über Verzeichnisebenen miteinander kombiniert werden.
  • Diverse Elemente (Session, Collection, Module, ...) können beerbt werden, um eigene Funktionalität unterzubringen.
  • Dazu werden via "conftest.py" dynamisch die konkreten Klassen für Session, Collection, Module, ... nachgeschlagen, die unterhalb eines Verzeichnisses verwendet werden sollen.
  • Fehlerberichte können in HTMl generiert werden. Dies kann ältere Testläufe beinhalten, so dass man den historischen Verlauf einsehen kann.
  • Weitere Plugins für Prolog-Tests, JavaScript-Tests (via SpiderMonkey), verteilte Tests um Tests auf anderen Maschinen (mit ggfs. anderen Plattformen) auszuführen, Integration mit klassischen UnitTest
  • Reporting kann man momentan nicht (einfach) anpassen
Fragen
  • Ist die py-Import-Magic kompatibel mit py2exe? Antwort: Unbekannt.
  • Wie schwer wird es sein py.test auf Python 3k auszuführen? Antwort: Unbekannt
  • Parallele Ausführung: über verteilte Tests. Können sowohl lokal als auch remote verteilt werden inkl. Multi-CPU-Support.
  • Gruppierung von tests nach Setup ala Layer: Gibt es momentan nichts.

Keine Kommentare: