Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Testen > Unittests > m_unittest

unittest: Das Standard-Testframework von Python

Idea

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!

Detailed

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, dass 1+1 gleich 2 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, dass math.sqrt(10)**2 (lesen Sie ggf. nach, was das bedeutet) gleich 10 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 von unittest 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.
Trace

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.