Unit Tests gehören zum Handwerkszeug professioneller Softwareentwicklung. Doch oft enden sie als lästige Pflichtübungen: Tests, die kaum etwas prüfen, bei Änderungen ständig brechen oder nur das Offensichtliche bestätigen. Damit Unit Tests echten Mehrwert liefern, braucht es Klarheit über Ziele und Nutzen.
Typische Probleme von Unit Tests
- Triviale Tests: Sie prüfen nur Getter/Setter oder spiegeln die Implementierung Zeile für Zeile wider. Nutzen: null.
- Fragile Tests: Schon kleine Refactorings führen zu Fehlschlägen, ohne dass sich das Verhalten geändert hat.
- Fehlender Fokus: Tests prüfen Nebensächlichkeiten, aber nicht die fachlich wichtigen Regeln.
- Unlesbarkeit: Komplexe Testlogik, die schwerer zu verstehen ist als der eigentliche Code.
Was macht Tests wertvoll?
Ein guter Unit Test erfüllt mindestens eine dieser Bedingungen:
- Er deckt fachlich relevante Regeln ab (z. B. Preisberechnung, Sicherheitsprüfung).
- Er erhöht Vertrauen in Refactorings, weil er Verhalten statt Implementierung testet.
- Er dokumentiert beabsichtigtes Verhalten lesbar und nachvollziehbar.
- Er liefert schnelles Feedback bei Fehlern.
Prinzipien für Mehrwert
- Teste Verhalten, nicht Implementation. Statt assertEquals(42, obj.getValue()) nur weil getValue() gerade 42 zurückgibt, lieber ein Szenario aufbauen, das fachlich Sinn ergibt.
- Halte Tests unabhängig. Jeder Test muss isoliert laufen können, ohne versteckte Abhängigkeiten.
- Benutze sprechende Namen. Ein Test mit Namen shouldRejectInvalidPassword() ist gleichzeitig Dokumentation.
- Edge Cases nicht vergessen. Fehlerfälle, Grenzwerte und Ausnahmen bringen oft mehr Erkenntnis als Happy-Path-Tests.
- Wartbarkeit bedenken. Tests sind Code und brauchen Pflege. Klare Strukturen und Hilfsfunktionen machen sie robust.
Beispiel: Wertvoller statt trivialer Test
Trivial:
TEST(UserTest, GetNameReturnsName) {
User u("Alice");
EXPECT_EQ("Alice", u.getName());
}
Kein echter Mehrwert, bestätigt nur, dass getName() zurückgibt, was im Konstruktor gesetzt wurde.
Mehrwert:
TEST(PasswordTest, RejectsShortPasswords) {
User u("Alice");
EXPECT_THROW(u.setPassword("123"), std::invalid_argument);
}
Dieser Test prüft eine Geschäftsregel: Passwörter müssen Mindestanforderungen erfüllen.
Fazit
Unit Tests mit Mehrwert konzentrieren sich auf Verhalten, Regeln und Robustheit. Sie sollen nicht die Implementierung abbilden, sondern Vertrauen schaffen und Wissen konservieren. Schlechte Tests sind Ballast, gute Tests sind Investitionen in Qualität und Wartbarkeit.

