unittest: Das Standard-Testframework von Python
Ziel
Ich kann Unittests mit dem Standard-Python-Testframework unittest
schreiben und ausführen.
Hintergrund
Anders als viele Sprachen hat Python ein Framework für automatisierte programmatische Tests in seiner Standardbibliothek. Das sollten wir natürlich kennen!
Arbeitsschritte
unittest
ist das von Python mitgelieferte Testframework.
Nutzen Sie die unittest
-Dokumentation
um die nachfolgenden Aufgaben zu lösen:
Ein erfolgreicher Test
- Legen Sie die Datei
unittests/test_unittest.py
an. - 1 Schreiben Sie darin einen Test
test_addition
, der sicherstellt, dass1+1
gleich2
ist. Bilden Sie die Struktur der Testklasse wie in "Basic example" beschrieben. - Lassen Sie den Teil mit
__name__ == '__main__
weg, diese Struktur wird nicht benötigt. - 1 Lassen Sie den Test laufen wie bei "Command-Line Interface" beschrieben.
- 1 Was bedeutet vermutlich der Punkt in der ersten Zeile der Ausgabe?
- 2 Machen Sie einen Commit von
unittests/test_unittest.py
.
git -P show HEAD
Ein fehlschlagender Test
- 2 Schreiben Sie einen zweiten Test
test_sqrt
, der sicherstellt, dassmath.sqrt(10)**2
(lesen Sie ggf. nach, was das bedeutet) gleich10
ist.
Dieser Test wird fehlschlagen, weil Gleitkomma-Arithmetik nicht beliebig genau ist. - 3 Wählen Sie einen sinnvollen Klassennamen.
- 3 Lassen Sie beide Tests laufen wie bei "Command-Line Interface" beschrieben.
- 2 Was bedeutet offenbar die erste Zeile der Ausgabe?
- Verstehen Sie sorgfältig die gesamte Ausgabe. Sie fällt bei realer Software (wo es eine Verschachtelung von Aufrufen des Anwendungscodes gibt) um einiges komplizierter aus und beschreibt recht präzise den Fehlerort und das Symptom.
- 4 Machen Sie einen Commit von
unittests/test_unittest.py
.
git -P show HEAD
test_sqrt
wird ja stets fehlschlagen, was die Ausgabe verwirrend macht. Schauen Sie das Inhaltsverzeichnis der Dokumentation nach diesem Thema durch. Markieren Sie den Test mit dem passenden Dekorierer vonunittest
als hoffnungslosen Fall.- 5 Lassen Sie beide Tests laufen.
- 3 Was bedeutet offenbar die Änderung in der ersten Zeile der Ausgabe?
- 6 Machen Sie einen Commit von
unittests/test_unittest.py
.
git -P show HEAD
Lösung für Vergleiche bei Gleitkomma-Arithmetik
- 4 Es gibt für Tests mit Gleitkommaarithmetik eine andere Assertion, die auf
"fast gleich" prüft statt auf "gleich". Damit lässt sich der Test
test_sqrt
doch noch retten.
Bauen Sie den Test entsprechend um und aktivieren Sie ihn wieder. Nehmen Sie zur Kenntnis, was diese Assertion intern tut (rechte Spalte der Tabelle). - 7 Lassen Sie beide Tests laufen.
Test mit erwarteter Exception
- 5 Schreiben Sie einen dritten Test, der sicherstellt, dass
math.sqrt(-1)
genau die in dessen Dokumentation angekündigte Exception erzeugt. Wählen Sie einen beschreibenden Namen für den Test. - 8 Lassen Sie alle drei Tests laufen.
Abgabe
Geben Sie den Quellcode ab, wie er am Ende der Aufgabe vorliegt.
Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.
Geben Sie ein Markdown-Dokument ab mit knappen Antworten zu den oben gestellten Fragen
1, 2, … Geben Sie diese Marker mit an.
Geben Sie ggf. Beispiele oder benutzte Quellen an.