Komponententest
R 2.0.0
Beschreibung
Softwareanwendungen können sehr umfangreich sein, daher ist es eine Herausforderung solche Systeme vollumfänglich zu testen. Bevor ein gesamtes System getestet wird, ist es wichtig, dass jede Komponente bzw. die kleinste Einheit der Anwendung gründlich getestet wird.
Die Hauptziele des Komponententests bestehen darin, das Eingabe- und Ausgabeverhalten eines Testobjekts zu überprüfen. Es soll sichergestellt werden, dass die Funktionalität des Testobjekts gemäß der gewünschten Spezifikation ordnungsgemäß und vollständig gegeben ist.
Fehlerzustände werden meist behoben, sobald sie gefunden werden, oftmals ohne formales Fehlermanagement.
Das übergeordnete Ziel ist es mithilfe der Unit Tests alle wichtigen Bestandteile der Implementierung mit hoher Testabdeckung zu testen. Je nach Geschäftsanforderungen und Kritikalität des Software-Produktes variieren die Anforderungen an die minimale sinnvolle Testabdeckung der Unit Tests. Komponententests helfen bei der Regression, stellen Dokumentation bereit und unterstützen Sie beim Entwerfen guten Codes.
Der Komponententest wird üblicherweise von dem Entwickler durchgeführt, der den Code geschrieben hat.
Manuell durchgeführte Komponenten- bzw. Regressionstests haben einen niedrigeren Testabdeckungsgrad also automatisierte Tests.
Für normale, nicht-kritische Software-Produkte ist eine Testabdeckung von mindestens 60% anzustreben. Im Umfeld kritischer Systeme wie z.B. Medizintechnik werden üblicherweise deutliche höhere Unit Test Testabdeckungswerte verlangt.
Unit Tests werden überwiegend als White-Box Tests implementiert, die sowohl die positiven als auch negativen Interaktionspfade und Zustände in den jeweiligen Code-Einheiten abdecken.
Ein Unit Test ist automatisiert, d.h. er wird von einer Software (Unit Testing Framework/Unit Testing Tool) und nicht von einem Menschen manuell durchgeführt. Der Vorteil der Unit Test ist, dass man schnell und damit häufiger testen kann als bei manuellen Tests und somit Fehler (insbesondere Regressionsfehler, die sich durch Änderungen am Programmcode ergeben haben) zeitnah feststellen kann. Unit Test erlauben die automatisierte, wiederholbare, kontinuierliche Prüfung (werkzeuggestützt!).
Video: Komponententest (Länge: 20:28)
Vorteile der Unit Tests
Der große Vorteil der Unit Tests besteht darin, dass man sie in einer sehr frühen Software-Entwicklungsphase unmittelbar während der Entwicklung schreiben und zur sofortigen Überprüfung der gerade programmierten Code-Stücke einsetzen kann.
Damit können Unit Tests auch unfertige und nicht-lauffähige Softwarekomponenten testen. Die einzige Voraussetzung bei den meisten Programmiersprachen ist, dass das zu testende Software-Modul kompilierfähig ist.
Aufgrund der geringen (oder im Optimalfall sogar gar keinen) Abhängigkeiten von anderen Modulen und Daten laufen die Unit Tests nicht nur blitzschnell, sondern in der Regel sehr stabil. Das liegt daran, dass es wegen der hohen Isolation kaum externe Ereignisse gibt, die das Verhalten bzw. die Stabilität beeinflussen können (wie z.B. Änderung der Datenbasis in der Datenbank, Nicht-Verfügbarkeit eines Web-Services u.v.m.)
Durch ein gemeinsames Test-Framework werden Debugging-Prozesse und Fehlersuche erleichtert.
Jede Teststufe hat individuelle Testziele, Testbasis, Testobjekte, Testvorgehensweisen, Verantwortlichkeiten sowie typische Fehlerzustände & -wirkungen.
Wie funktioniert Unit-Test-Traceability?
Rückverfolgbarkeit (Traceability)
In einem agilen Softwareentwicklungsprojekt werden zu Beginn Epics definiert, welche für ein Feature oder einen Teil eines Features repräsentativ sind. Im nächsten Schritt werden User Storys definiert und auf Basis dieser Tasks abgeleitet. Die Entwicklung implementiert diese Tasks und daraus resultiert der eigentliche Programm-Code und natürlich Unit Tests, welche den Code auf Herz und Nieren prüfen.
Auf der rechten Seite wird erkennbar, wie die Beziehung vom Programm-Code bis hin zu den funktionalen Anforderungen zurückverfolgt werden kann. Voraussetzung dafür ist die Verwendung eindeutiger Identifikationsnummern, welche die Artefakte durchgängig durch den Softwarelebenszyklus begleiten.
Genau durch diese Eigenschaft ist es möglich, von unserem Blatt (Programm-Code und Unit Tests) auf einen Task, eine User-Story und in weiterer Folge auf ein Epic zu schließen. Somit sind alle Informationen, welche wir für eine Rückverfolgbarkeit (Traceability) brauchen, gegeben und können verwertet werden.
Falls Sie noch nicht auf den agilen Zug aufgesprungen sind, machen Sie sich keine Sorgen, dasselbe Modell ist auch auf ein nicht-agiles Softwareentwicklungsmodell anwendbar.
Mock-Objekt
Ein Mock-Objekt ist ein Platzhalter in der Softwareentwicklung für noch nicht realisierte Objekte, die frühzeitige Komponenten- / Integrationstests ermöglicht. Mocks simulieren das Verhalten der realen Objekte.
Beispielsweise lassen sich Mock-Objekte nutzen, wenn:
-
das gewünschte Objekt noch nicht zur Verfügung steht.
-
das reale Objekt nicht durch einen Test beschädigt werden soll – bspw. Daten dauerhaft löscht.
-
ein Verhalten nachgestellt werden soll, das nur schwierig auszulösen ist.
-
die reale Lösung zu komplex und langsam für einen Test ist – z. B. eine vollständige Datenbank, die vor jedem Test initialisiert werden müsste.
Reifegradbestimmung & Entscheidungshilfen
-
Bestimmung des Reifegrades und Entscheidungshilfen sind unter folgender Seite zu finden → Reifegradbestimmung & Entscheidungshilfen → Komponententest
-
Beschreibung des Reifegrades → zum Reifegrad des Komponententests
Quellen
-
Abbildungen Anwendungsbeispiel: FLATICON, Freepik Company S.L. Autor*in: juicy_fish, abgerufen am 27.11.2024
-
ISTQB Glossary Komponententest, abgerufen am 19.08.2024
-
YouTube Patrick Harms UX Video 1 - Komponententest, abgerufen am 01.02.2024
-
A. Spillner, T. Linz - Basiswissen Softwaretest, 7. Auflage, 2024
-
TechTarget, flaky test, abgerufen am 01.02.2024