Red/Green TDD
Details
- Auch bekannt als
-
Red-Green-Refactor, Klassischer TDD-Zyklus, Test-First-Entwicklung
Kernkonzepte:
- Red-Phase
-
Schreibe zuerst einen fehlschlagenden Test, bevor irgendwelcher Produktionscode existiert. Der Test muss tatsächlich laufen und aus dem richtigen Grund scheitern — Kompilierfehler zählen nicht als rot.
- Green-Phase
-
Schreibe das Minimum an Produktionscode, das den fehlgeschlagenen Test grün macht. Widerstehe dem Drang, Funktionalität hinzuzufügen, die der Test nicht verlangt.
- Refactor-Phase
-
Mit grünen Tests verbessere das Design — umbenennen, extrahieren, Duplikate entfernen — im Vertrauen darauf, dass die Testsuite Regressionen fängt.
- Kleine Schritte
-
Jeder Zyklus ist bewusst klein (Sekunden bis Minuten), nicht Stunden. Große Sprünge zerstören die Feedback-Schleife.
- Scheitern beobachten
-
Zu verifizieren, dass der Test tatsächlich vor der Implementierung fehlschlägt, fängt tautologische Tests und Tippfehler im Test selbst.
- Testnamen beschreiben Verhalten
-
Nicht Methodennamen. "Gibt leere Liste zurück, wenn keine Benutzer existieren" sagt, was der Code tut; "test getUsers" nicht.
- Minimum zum Bestehen
-
"Fake it" (return 42), hardcoden, kopieren — was auch immer den Test am schnellsten grün macht. Verallgemeinerung passiert in der Refactor-Phase durch Triangulation.
- Ein Test nach dem anderen
-
Zu jedem Zeitpunkt nur ein fehlschlagender Test in der Suite. Niemals einen zweiten fehlschlagenden Test hinzufügen, bevor der erste grün ist.
- Schlüsselvertreter
-
Kent Beck ("Test-Driven Development: By Example", 2002); für LLM-Coding-Agents popularisiert durch Simon Willison
Wann zu verwenden:
-
Instruktion von LLM-Coding-Agents, die standardmäßig Features zuerst implementieren und Tests hinterher schreiben
-
Neuer Produktionscode, bei dem Anforderungen als konkrete Beispiele ausgedrückt werden können
-
Bugfixes — schreibe einen fehlschlagenden Test, der den Bug reproduziert, dann behebe ihn
-
Refactoring von Legacy-Code ohne Testabdeckung (beginne mit Charakterisierungstests)
-
Vermittlung disziplinierter inkrementeller Entwicklung
Verwandte Anker:
-
TDD Chicago School - Zustandsbasiertes klassisches TDD, das echte Objekte statt Mocks bevorzugt
-
TDD London School - Mock-lastige, interaktionsbasierte, outside-in Variante
-
BDD Given-When-Then - Verhaltensgetriebene Ergänzung für höhergelegene Akzeptanztests
Kritik:
-
David Heinemeier Hansson, "TDD is dead. Long live testing." (2014) — Test-First als Dogma führe zu "test-induced design damage"; die anschließende Gesprächsreihe "Is TDD Dead?" mit Kent Beck und Martin Fowler kartiert die gesamte Debatte
-
James O. Coplien, "Why Most Unit Testing is Waste" (2013) — die meisten Low-Level-Unit-Tests liefern wenig Absicherung im Verhältnis zu ihren Wartungskosten
-
Die empirische Lage ist gemischt: Replikationsstudien (z. B. Fucci et al., "A Dissection of the Test-Driven Development Process", IEEE TSE 2017) legen nahe, dass die beobachteten Vorteile aus kleinen iterativen Schritten stammen, nicht aus dem Schreiben des Tests zuerst