Hör auf zu raten: Warum TDD kein Masochismus, sondern eine Superkraft ist
\n\nStell dir vor: Du schreibst Code. Alles funktioniert. Du bist zufrieden. Einen Monat später kehrst du zum Projekt zurück, nimmst eine kleine Änderung vor – und alles geht kaputt. Kommt dir bekannt vor? Und jetzt stell dir vor, du hast ein Sicherheitsnetz, das jeden Fehler in Sekundenschnelle abfängt. Das ist TDD in TypeScript – testgetriebene Entwicklung.
\n\nViele Entwickler denken, TDD sei etwas für Perfektionisten oder für NASA-Projekte. Spoiler: Das stimmt nicht. Test Driven Development ist ein Werkzeug, das Stunden des Debuggens spart, die Codequalität verbessert und Refactoring sicher macht. In diesem Artikel schlüsseln wir TDD TypeScript anhand realer Beispiele auf, ohne unnötige Theorie und Abstraktionen.
\n\nWenn du in TypeScript schreibst und keine Angst mehr vor deinen eigenen Änderungen haben willst – lies weiter. Es wird interessant.
\n\nWas ist TDD (und warum es nicht um "Tests schreiben" geht)
\n\nTDD (Test-Driven Development) ist eine Methodik, bei der Tests vor dem Code geschrieben werden. Klingt verrückt? Nur auf den ersten Blick. Der TDD-Zyklus besteht aus drei Schritten:
\n\n- \n
- Rot (Red) – Schreibe einen Test, der garantiert fehlschlägt, weil es den Code noch nicht gibt. \n
- Grün (Green) – Schreibe minimalen Code, damit der Test besteht. \n
- Refactoring (Refactor) – Verbessere den Code, ohne sein Verhalten zu ändern. \n
Und so weiter – im Kreis. Jedes neue Funktionsstück beginnt mit einem Test. Das diszipliniert, zwingt dazu, vorab über das API-Design nachzudenken, und gibt die Gewissheit, dass alles wie am Schnürchen läuft.
\n\nÜbrigens: Unit-Tests in TypeScript sind nicht nur eine "Funktionsprüfung". Sie sind Dokumentation, Spezifikation und Versicherung in einem.
\n\nWerkzeuge für TDD in TypeScript: Was installiert werden muss
\n\nFür TypeScript-Testing benötigen wir:
\n\n- \n
- Jest – das beliebteste Test-Framework. Funktioniert out-of-the-box mit TypeScript. \n
- ts-jest – ein Preset für Jest, damit es TypeScript ohne zusätzliche Konfiguration versteht. \n
- @types/jest – Typen für die Autovervollständigung in der IDE. \n
Installation mit einem Befehl:
\n\nnpm install --save-dev jest ts-jest @types/jest typescript\n\nFüge in package.json ein Skript zum Ausführen der Tests hinzu:
"scripts": {\n "test": "jest",\n "test:watch": "jest --watch"\n}\n\nJetzt ist alles bereit für die testgetriebene Entwicklung in TypeScript.
\n\nDen ersten Test mit TDD schreiben: Von Rot zu Grün
\n\nAngenommen, wir müssen eine Funktion schreiben, die prüft, ob ein String ein Palindrom ist. Nach der TDD-Klassik – beginnen wir mit dem Test.
\n\nSchritt 1. Rot (Red)
\n\nErstelle die Datei isPalindrome.test.ts:
import { isPalindrome } from './isPalindrome';\n\ndescribe('isPalindrome', () => {\n it('sollte true für den String "racecar" zurückgeben', () => {\n expect(isPalindrome('racecar')).toBe(true);\n });\n\n it('sollte false für den String "hello" zurückgeben', () => {\n expect(isPalindrome('hello')).toBe(false);\n });\n});\n\nFühre den Test aus:
\n\nnpm test\n\nWir sehen einen Fehler: Cannot find module './isPalindrome'. Perfekt, die rote Phase ist abgeschlossen. Jetzt müssen wir Code schreiben, damit der Test besteht.
Schritt 2. Grün (Green)
\n\nErstelle isPalindrome.ts mit einer minimalen Implementierung:
export function isPalindrome(str: string): boolean {\n return str === str.split('').reverse().join('');\n}\n\nFühre die Tests erneut aus – grün! Beide Tests bestehen. Aber das ist noch nicht alles.
\n\nSchritt 3. Refactoring (Refactor)
\n\nUnsere Funktion funktioniert, aber es gibt einen Haken: Sie verarbeitet keine Strings mit Leerzeichen und unterschiedlicher Groß-/Kleinschreibung. Fügen wir einen neuen Test hinzu:
\n\nit('sollte Groß-/Kleinschreibung und Leerzeichen ignorieren',