„Die Unit Tests schreibe ich immer zum Schluss!“
Irgendein Kollege
Das Eingangszitat hat vermutlich schon jeder Entwickler von einem Kollegen hören müssen. Üblicherweise, wenn man bei einem schwerwiegenden Problem während der Implementierung helfen möchte. Ein kurzer Blick auf die Testergebnisse hilft dann enorm. Häufig zeigen die fehlgeschlagenen Unit Tests direkt auf das Problem. Fehlen die Unit Tests, dann müssen sich die Entwickler solange durch GIT Historie und Debugger quälen, bis der eingeschleppte Fehler gefunden ist.
Jeder Entwickler sollte seine Unit Tests so früh wie möglich schreiben und “so früh wie möglich” heißt dann vor der Implementierung und wird dann Test Driven Development genannt. Mit dem Test zu beginnen hat zwei einfache und geniale Konsequenzen. Ohne störende Implementierung kann der Test viel einfacher geschrieben werden und außerdem schlägt er zu Beginn auch ganz sicher fehl.
Diese beiden Konsequenzen mögen etwas skurril anmuten aber bei gewachsener Software ist eines der größten Probleme für Unit Tests die schlechte Entkopplung der Komponenten. Werden die Unit Tests zuerst formuliert, dann wird automatisch eine Entkopplung erreicht. Ein Test, der ohne korrekte Implementierung der Funktionalität fehl schlägt, stellt sicher, dass er tatsächlich eine aussagekräftige Prüfung vornimmt. Ein Test der schon ohne Feature erfolgreich ist, prüft vermutlich nichts oder etwas falsches.
Richtig genutzte Unit Test beschleunigen die Software Entwicklung wie eine Maurerschnur das Errichten einer Wand. Wer mit dem Maurergewerbe nicht so vertraut ist, kennt sie vermutlich nicht, wird aber den Begriff der Richtschnur schon einmal gehört haben.
Bevor der Maurer eine neue Ziegelreihe setzt, befestigt er eine Schnur an beiden Ecken der Wand. Etwa eine Steinhöhe über der letzten Reihe und waagerecht. Danach kann der Maurer die Steine der neuen Reihe schnell setzen, weil er nicht jedes Mal prüfen muss, ob die Reihe steigt oder fällt. Die Schnur ihm zeigt ob er Stein zu tief oder zu hoch steht. Dann kann er mit mehr oder weniger Speis die Höhe ausgleichen.
Die Unit Tests sind genau diese Schnüre, die dem Entwickler bei jeder neuen Funktionalität zeigen, ob sie noch zu den Vorgaben passt und ob alle anderen Funktionalitäten auch noch passen. Sie sind nicht einfach ein Hilfsmittel um nachträglich die Korrektheit der Implementierung zu beweisen, sondern sind ein Werkzeug für den Entwickler während der Implementierung.