Erst der Test, dann der Code
Testgetriebene Entwicklung, englisch Test-driven Development oder kurz TDD, heißt: Sie schreiben den Test, bevor Sie den Code schreiben. So wächst eine Funktion in kleinen Schritten, und jeder Schritt ist geprüft.
Eine Kassensoftware soll Cent-Beträge als Text mit Komma anzeigen, zum Beispiel „1,50 Euro“. Wer erst alles schreibt, findet die Fehler erst spät. Wer in kleinen Schritten arbeitet, findet sie sofort.
Am Ende dieser Lektion
Notiz
Ich kann einen fehlschlagenden Test schreiben, ihn bestehen lassen und dann aufräumen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Rot | Der neue Test schlägt fehl, wie gewollt |
| Grün | Der Test besteht mit möglichst wenig Code |
| Refactoring | den Code aufräumen, ohne sein Verhalten zu ändern |
| Regressionstest | ein alter Test, der meldet, wenn eine Änderung etwas Altes zerstört |
| kleiner Schritt | ein neuer Test für genau eine neue Regel |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Der Zyklus heißt Rot, Grün, Refactoring
Jede Runde hat drei Schritte. Rot: Sie schreiben einen Test für eine Regel, die noch nicht stimmt, und sehen ihn scheitern. Grün: Sie schreiben gerade so viel Code, dass er besteht. Refactoring: Sie räumen den Code auf, und alle Tests bleiben grün.
Dann beginnt die nächste Runde mit der nächsten Regel.
Eine Funktion wächst im Lab Test für Test
Sie bauen eurotext(cent) im Lab. Zuerst schreiben Sie einen Test für „1,50 Euro“. Er scheitert, denn die Funktion gibt es noch nicht.
Dann schreiben Sie die Funktion, fügen einen zweiten Test für 5 Cent hinzu und lassen auch ihn zuerst scheitern. Lesen Sie jedes Mal die letzte Zeile des Testlaufs.
Den Ordner anlegen
mkdir -p ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Hineingehen
cd ~/testlaborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Alte Dateien dieser Übung entfernen
rm -f eurotext.py test_eurotext.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Rot: den ersten Test schreiben
printf 'import unittest\nfrom eurotext import eurotext\n\nclass TestEurotext(unittest.TestCase):\n def test_ein_euro_fuenfzig(self):\n self.assertEqual(eurotext(150), "1,50 Euro")\n' > test_eurotext.pyHier 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
python3 -m unittest test_eurotext 2>&1 | tail -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Grün: die einfachste Funktion
printf 'def eurotext(cent):\n euro, rest = divmod(cent, 100)\n return str(euro) + "," + str(rest) + " Euro"\n' > eurotext.pyHier 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
python3 -m unittest test_eurotext 2>&1 | tail -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Beispiel: zwei Runden mit eurotext
| Runde | Neuer Test | Farbe vor dem Code | Änderung am Code |
|---|---|---|---|
| 1 | eurotext(150) ergibt 1,50 Euro | Rot: es gibt die Funktion nicht | Euro und Rest mit divmod trennen |
| 2 | eurotext(5) ergibt 0,05 Euro | Rot: die Funktion gibt 0,5 Euro aus | Bei Resten unter 10 eine 0 voranstellen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Rot: den zweiten Test anhängen
printf '\n def test_fuenf_cent(self):\n self.assertEqual(eurotext(5), "0,05 Euro")\n' >> test_eurotext.pyHier 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
python3 -m unittest test_eurotext 2>&1 | tail -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Grün: die Funktion verbessern
printf 'def eurotext(cent):\n euro, rest = divmod(cent, 100)\n cents = str(rest)\n if rest < 10:\n cents = "0" + cents\n return str(euro) + "," + cents + " Euro"\n' > eurotext.pyHier 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
python3 -m unittest test_eurotext 2>&1 | tail -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, ein roter Test sei ein Misserfolg. In diesem Zyklus ist Rot der erste Beweis: Der Test kann scheitern. Ein Test, der nie rot war, könnte nichts prüfen. Schreiben Sie auch nie zuerst viel Code und danach alle Tests auf einmal.
Aufräumen ist sicher, wenn die Tests grün sind
Beim Refactoring ändern Sie den Aufbau des Codes, nicht sein Verhalten: bessere Namen, weniger Wiederholung. Nach jeder kleinen Änderung läuft der Testlauf.
Bleibt er grün, ist nichts kaputtgegangen. Alte Tests, die so schützen, heißen Regressionstests.