Unit-Test-Frameworks
Konzept und Sammlung von Bibliotheken und Konventionen zum Schreiben und Ausführen isolierter Unit-Tests.
Klassifikation
- KomplexitätMittel
- AuswirkungTechnisch
- EntscheidungstypArchitektur
- OrganisationsreifeFortgeschritten
Technischer Kontext
Prinzipien & Ziele
Use Cases & Szenarien
Kompromisse
- Scheinbare Sicherheit bei unzureichender Testabdeckung (false sense of security).
- Verzögerungen im CI durch lange Laufzeiten großer Test-Suiten.
- Übermäßige Abhängigkeit von Framework-spezifischen Features erschwert Migration.
- Schreibe kleine, klare Tests mit eindeutigen Assertions.
- Verwende Fixtures sparsam und reproduzierbar.
- Automatisiere Testläufe in Pull-Request- und Merge-Checks.
I/O & Ressourcen
- Modularer, testbarer Quellcode
- Zugriff auf Build- und CI-Infrastruktur
- Bibliotheken für Assertions und Test-Doubles
- Automatisierte Unit-Test-Suiten
- Testberichte und Coverage-Artefakte
- Metriken zur Testqualität und Laufzeit
Beschreibung
Unit-Test-Frameworks bieten Struktur, Werkzeuge und Konventionen zum Schreiben und Ausführen isolierter Tests, die einzelne Code-Einheiten validieren. Sie definieren Test-Lifecycle, Assertions, Fixtures und Reporting und lassen sich in Build‑Pipelines und Coverage‑Tools integrieren, um schnelles, zuverlässiges Feedback während der Entwicklung zu gewährleisten.
✔Vorteile
- Ermöglichen frühes Erkennen von Fehlern im Entwicklungszyklus.
- Reduzieren Risiko beim Refactoring durch automatisierte Absicherung.
- Verbessern Dokumentation des erwarteten Verhaltens einzelner Einheiten.
✖Limitationen
- Tests decken nur das getestete Unit-Verhalten, nicht Integrationsprobleme.
- Pflegeaufwand steigt mit Anzahl und Komplexität der Tests.
- Falsche Isolierung (zu starke Mocks) kann Vertrauen untergraben.
Trade-offs
Metriken
- Testabdeckung (Coverage)
Prozentsatz der durch Unit-Tests abgedeckten Codezeilen oder Branches.
- Durchschnittliche Testlaufzeit
Mittlere Ausführungszeit der kompletten Unit-Test-Suite in CI.
- Fehlerdichte pro Einheit
Anzahl gefundener Fehler pro getesteter Funktionalitätseinheit im Zeitverlauf.
Beispiele & Implementierungen
JUnit in Java-Projekten
Weit verbreitetes Framework mit Annotationen für Lifecycle, Assertions und Integration in Build-Tools wie Maven oder Gradle.
pytest in Python-Projekten
Flexibles Framework mit Fixtures, parametrisierten Tests und umfangreichem Plugin-Ökosystem zur Integration in CI.
xUnit-Architektur als Muster
Übergreifendes Muster, das Struktur und Konzepte für Unit-Test-Frameworks in verschiedenen Sprachen bereitstellt.
Implementierungsschritte
Evaluieren vorhandener Frameworks und Kriterien definieren
Pilotprojekt mit Kern-Tests aufsetzen und bewerten
Guidelines und Templates für Tests erstellen
Integration in CI und Monitoring einrichten
⚠️ Technische Schulden & Engpässe
Tech Debt
- Große Suite legacy-Tests mit hoher Laufzeit und schlechter Struktur.
- Framework-lock-in durch extensive Nutzung spezifischer Features.
- Unzureichende Test-Hierarchie und fehlende Modulgrenzen.
Bekannte Engpässe
Beispiele für Missbrauch
- Nur Coverage-Zahlen erhöhen ohne Testqualität zu prüfen.
- Tests als Implementierungsdokumentation missbrauchen (fragile Beispiele).
- Einführen schwergewichtiger Frameworks ohne Team-Training.
Typische Fallen
- Tests mit nicht-deterministischen externen Abhängigkeiten.
- Unklare Grenzen zwischen Unit- und Integrationstests.
- Vernachlässigung von Testwartung während Feature-Entwicklung.
Erforderliche Fähigkeiten
Drivers (Architectural Drivers)
Constraints
- • Begrenzte Ressourcen für parallele Testausführung in CI
- • Legacy-Code ohne klare Trennung erschwert Testbarkeit
- • Organisatorische Vorgaben zu Coverage-Checks