Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Unit-Tests mit Assertions schreiben

Nach dieser Lektion: Ich kann einen Unit-Test mit Assertions schreiben und ausführen.

Lektion, 55 Min.10 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Ein Test, der dieselbe Frage jedes Mal stellt

Ein Unit-Test ist ein kleines Programm, das eine einzelne Funktion mit einer festen Eingabe aufruft und das Ergebnis prüft. Es läuft in Sekunden und sagt sofort, ob die Funktion noch stimmt.

Eine Buchhaltung rechnet Nettopreise in Bruttopreise um. Wer die Funktion ändert, will nach jeder Änderung wissen, ob noch alles richtig ist. Von Hand wäre das jedes Mal Rechnen.

Am Ende dieser Lektion

Notiz

Ich kann einen Unit-Test mit Assertions schreiben und ausführen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Unit-Testein Test für eine einzelne Funktion
Assertioneine Behauptung, die wahr sein mussassert x == 3
erwarteter Wertdas Ergebnis, das Sie von Hand ausgerechnet haben
Testlaufein Durchgang, der alle Tests startet und zählt
Ausnahmeein Fehler, den ein Programm mit raise auslöstValueError

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Test hat drei Schritte: Arrange, Act, Assert

Jeder Test folgt demselben Muster. Arrange heißt vorbereiten: Sie legen die Eingabe fest. Act heißt ausführen: Sie rufen die Funktion auf. Assert heißt behaupten: Sie prüfen das Ergebnis gegen den erwarteten Wert.

Der erwartete Wert steht im Test fest drin. Sie rechnen ihn selbst aus, bevor Sie die Funktion fragen.

Drei Schritte in einem Skript

Code: python
def brutto(netto_cent):
    return netto_cent * 119 // 100

# Arrange: die Eingabe festlegen
netto = 1000
# Act: die Funktion aufrufen
ergebnis = brutto(netto)
# Assert: das Ergebnis prüfen
assert ergebnis == 1190, "Erwartet wurde 1190"
print("Test bestanden")
# Ändern Sie 1190 in 1200 und starten Sie noch einmal.

Ein häufiger Fehler

Warnung

Viele schreiben als erwarteten Wert denselben Ausdruck wie in der Funktion, zum Beispiel netto * 119 // 100. Dann stimmen Test und Funktion immer überein, auch wenn beide falsch sind. Rechnen Sie den Wert selbst aus und schreiben Sie die Zahl hin.

Das Modul unittest sammelt und zählt Tests

Python bringt das Modul unittest mit. Ein Test ist dort eine Methode, deren Name mit test_ beginnt, in einer Klasse, die von unittest.TestCase erbt.

Mit self.assertEqual(a, b) behaupten Sie, dass a gleich b ist. Mit python3 -m unittest startet der Testlauf. In den Aufgaben dieses Kits schreiben Sie dagegen einfache Funktionen mit einem assert. Beide Wege prüfen dasselbe.

Funktion und Tests im Lab anlegen

Sie legen im Lab zwei Dateien an: mwst.py mit der Funktion brutto und test_mwst.py mit drei Tests. Die Funktion rechnet Cent netto in Cent brutto um, mit 19 Prozent Umsatzsteuer, und lehnt negative Preise ab.

Der Testlauf schreibt viele Zeilen. Wir lesen nur die letzte mit tail -n 1: OK heißt, alles bestanden.

Den Ordner anlegen

Befehl
mkdir -p ~/testlabor

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Hineingehen

Befehl
cd ~/testlabor

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Funktion schreiben

Befehl
printf 'def brutto(netto_cent):\n    if netto_cent < 0:\n        raise ValueError("Der Preis darf nicht negativ sein")\n    return netto_cent * 119 // 100\n' > mwst.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die drei Tests schreiben

Befehl
printf 'import unittest\nfrom mwst import brutto\n\nclass TestBrutto(unittest.TestCase):\n    def test_hundert_cent(self):\n        self.assertEqual(brutto(100), 119)\n\n    def test_null(self):\n        self.assertEqual(brutto(0), 0)\n\n    def test_negativ(self):\n        with self.assertRaises(ValueError):\n            brutto(-1)\n' > test_mwst.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Testlauf starten, letzte Zeile

Befehl
python3 -m unittest test_mwst 2>&1 | tail -n 1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Test muss auch rot werden können

Ein Test, der nie fehlschlägt, könnte auch nichts prüfen. Bauen Sie deshalb absichtlich einen Fehler ein: Der Satz 119 wird zu 11.

Danach läuft der Test noch einmal. Die Meldung sagt, was erwartet wurde und was herauskam.

Den Fehler einbauen

Befehl
sed -i.bak 's/119/11/' mwst.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Testlauf, letzte Zeile

Befehl
python3 -m unittest test_mwst 2>&1 | tail -n 1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Meldung des Fehlers zeigen

Befehl
python3 -m unittest test_mwst 2>&1 | grep AssertionError

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Fehler wieder ausbauen

Befehl
sed -i.bak 's/ 11 / 119 /' mwst.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Noch einmal laufen lassen

Befehl
python3 -m unittest test_mwst 2>&1 | tail -n 1

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Überblick: die wichtigsten Assertions in unittest

MethodeSie behauptenBeispiel
assertEqual(a, b)a ist gleich bself.assertEqual(brutto(100), 119)
assertTrue(x)x ist wahrself.assertTrue(ist_gerade(4))
assertIn(a, liste)a steckt in der Listeself.assertIn("a", "Haus")
assertRaises(Fehler)Der Aufruf löst diese Ausnahme auswith self.assertRaises(ValueError):

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.