Unit Testing
Isolierte, automatisierte Tests einzelner Codeeinheiten zur Sicherstellung von Korrektheit und Vermeidung von Regressionen.
Klassifikation
- KomplexitätNiedrig
- AuswirkungTechnisch
- EntscheidungstypDesign
- OrganisationsreifeFortgeschritten
Technischer Kontext
Prinzipien & Ziele
Use Cases & Szenarien
Kompromisse
- Übermäßiger Fokus auf Coverage statt auf sinnvolle Tests.
- Flaky Tests verringern Vertrauen in die Test-Suite.
- Unzureichende Tests erlauben Regressionen in Integrationspfaden.
- Schreibe kleine, fokussierte Tests, die ein Verhalten verifizieren.
- Verwende Mocks sparsam und nur für echte externe Abhängigkeiten.
- Automatisiere Testausführung in der CI und halte Laufzeiten kurz.
I/O & Ressourcen
- Quellcode der zu testenden Unit
- Testframework und Assertion-Bibliotheken
- Definition der erwarteten Schnittstellen und Verhalten
- Automatisierte Testfälle mit Assertions
- Reports über Testläufe und Misserfolge
- Regressionserkennung bei Codeänderungen
Beschreibung
Unit-Tests prüfen einzelne Softwareeinheiten isoliert auf Korrektheit und entdecken Regressionen früh im Entwicklungsprozess. Automatisierte, schnelle Tests laufen häufig lokal und in CI-Pipelines. Gute Unit-Tests fördern modulare Architektur, erleichtern Refactoring und liefern Entwickler:innen rasches Feedback zur Qualität des Codes. Sie sind die Grundlage für zuverlässige, automatisierte Teststrategien.
✔Vorteile
- Ermöglicht frühes Erkennen von Fehlern während der Entwicklung.
- Unterstützt Refactoring durch automatisierte Regressionsprüfung.
- Erhöht Code-Qualität und Design durch gezielte, modulare Tests.
✖Limitationen
- Deckt keine Integrations- oder Systemfehler ab.
- Hoher Wartungsaufwand bei häufigen Interface-Änderungen.
- Falsch konfigurierte Mocks können falsche Sicherheit vermitteln.
Trade-offs
Metriken
- Testlaufzeit
Mittlere Ausführungsdauer der Unit-Test-Suite pro Commit.
- Testabdeckung (Coverage)
Prozentsatz des Codes, der von Unit-Tests abgedeckt ist (Line/Branch).
- Fehlerrate pro Commit
Anteil der Commits, die Unit-Test-Fehler im CI auslösen.
Beispiele & Implementierungen
JUnit-Suite für Service-Klasse
Konzentration auf einzelne Service-Methoden mit Mocking der Abhängigkeiten.
pytest-Module für Python-Bibliothek
Parametrisierte Tests prüfen unterschiedliche Inputs und Randfälle automatisiert.
CI-Testlauf gegen Pull Request
Automatischer Testlauf verhindert das Einbringen regressiver Änderungen.
Implementierungsschritte
Identifizieren einer klaren Unit und ihrer Schnittstellen.
Einrichten eines Testframeworks und Basis-Testfälle schreiben.
Integration der Tests in CI und kontinuierliche Ausführung sicherstellen.
Regelmäßige Wartung: Refactoren von Tests bei API-Änderungen.
⚠️ Technische Schulden & Engpässe
Tech Debt
- Große, monolithische Testsuiten mit langen Laufzeiten.
- Unzureichend modulare Codebasis erschwert Unit-Test-Möglichkeiten.
- Fehlende Testdaten-Isolierung führt zu nicht-deterministischen Ergebnissen.
Bekannte Engpässe
Beispiele für Missbrauch
- Unit-Tests, die eigentlich Integrationstests sind und externe Systeme ansprechen.
- Ausufernde Coverage-Metriken ohne Fokus auf kritische Pfade.
- Mocking der zu testenden Logik statt der externen Abhängigkeiten.
Typische Fallen
- Fehlende Wartung führt zu veralteten oder irreführenden Tests.
- Flaky-Tests ignorieren statt beheben vermindert Vertrauen.
- Testabhängigkeiten zwischen Units führen zu schwer zu debuggen Fehlern.
Erforderliche Fähigkeiten
Drivers (Architectural Drivers)
Constraints
- • Begrenzter Zugang zu realen Abhängigkeiten erfordert Mocks/Stubs.
- • Legacy-Code kann schwer isolierbar sein.
- • Testdatenmanagement muss deterministisch gestaltet sein.