Wann ich keine Tests schreibe
- Matt
In fast jedem Projekt kommt irgendwann die Frage nach der Testabdeckung, meist verbunden mit einer Zahl, die jemand für angemessen hält. Achtzig Prozent ist beliebt. Woher die Zahl stammt, kann selten jemand sagen.
Ich halte die Frage für falsch gestellt.
Wo Tests sich immer auszahlen
Überall dort, wo Regeln stehen, die jemand ausgedacht hat. Fristberechnung, Rabattlogik, Zustandsübergänge, Validierung. Das sind Stellen mit klaren Eingaben, klaren Ausgaben und der Eigenschaft, dass eine Änderung an einer Ecke an einer anderen etwas kaputtmacht.
Diese Tests schreibe ich, bevor der Code fertig ist, weil sie beim Nachdenken helfen. Ein Fall, den man beim Testschreiben findet, ist billiger als einer, den ein Nutzer findet.
Zweiter Bereich: alles, was schon einmal falsch war. Ein Fehler, der gemeldet wurde, bekommt einen Test, bevor er behoben wird. Das ist die einzige Regel, bei der ich keine Ausnahme mache.
Wo ich sie weglasse
Bei Code, der nur weiterreicht. Ein Controller, der eine Methode aufruft und das Ergebnis zurückgibt, hat keine Logik, die kaputtgehen könnte. Ein Test darauf prüft, dass ein Mock aufgerufen wurde, also die Implementierung statt des Verhaltens. Solche Tests schlagen bei jedem Umbau fehl, ohne je einen echten Fehler gefunden zu haben.
Ebenso bei Zuordnungscode. Ein Mapper von Entität zu DTO mit zwanzig Feldern lässt sich testen, aber der Test ist dieselbe Liste noch einmal. Vergisst man ein Feld im Mapper, vergisst man es meistens auch im Test.
Warum die Zahl irreführt
Eine Abdeckung von 80 Prozent sagt nur, dass 80 Prozent der Zeilen einmal durchlaufen wurden. Sie sagt nichts darüber, ob dabei etwas geprüft wurde. Ein Test ohne einzige Zusicherung erhöht die Zahl genauso.
Schlimmer ist der Anreiz: Wer eine Quote erreichen muss, testet zuerst das, was leicht zu testen ist. Und leicht zu testen ist genau der Code, der ohnehin selten kaputtgeht.
Womit ich stattdessen arbeite
Zwei Fragen. Erstens: Wenn ich diese Zeile ändere und dabei einen Fehler mache, merkt es jemand vor der Auslieferung? Zweitens: Traue ich mich, diesen Code umzubauen?
Wo beide Antworten unangenehm ausfallen, kommt ein Test hin. Das ergibt bei mir keine 80 Prozent, sondern irgendetwas zwischen 40 und 60. Dafür sind die Tests, die da sind, welche, deren Rotwerden etwas bedeutet.