Integrationstests: Strategien und Herausforderungen

Bei der Durchführung großer Software-Projekte schleichen sich leider auch beim erfahrensten Programmierer hin und wieder Fehler in den Code ein. Diverse Testverfahren sollen helfen, dieser wieder Herr zu werden: Mit Unit-Tests überprüft man Komponenten unabhängig von anderen und garantiert die funktionale Korrektheit. Integrationstests stellen anschließend sicher, dass das Zusammenspiel und die Kommunikation der Komponenten untereinander fehlerfrei ablaufen. Nachfolgend wollen wir Strategien und Herausforderungen dieses Verfahrens näher beleuchten.

Für Leser, die über Software-Tests bisher wenig gelesen haben, bietet der Artikel Software-Tests: Notwendigkeit und Arten des Testens einen schnellen Einstieg in die Thematik.

Warum Integrationstests unverzichtbar sind

Das Ziel von Integrationstests besteht darin, Fehler aufzudecken, die ein Unit-Test alleine nicht finden kann. Das liegt vor allem daran, dass der Unit-Test die einzelnen Module eines komplexen Softwareprojekts unabhängig von allen anderen betrachtet. Das reicht völlig aus, wenn es nur darum geht zu gewährleisten, dass der Code das tut, was man von ihm erwartet, ist aber völlig unzureichend, wenn man sicherstellen will, dass die Kommunikation mit anderen Modulen reibungslos läuft.

Und genau an dieser Stelle setzen Integrationstests an: Mit ihnen versucht man, Fehler aufzudecken, die durch die Kommunikation zwischen einzelnen Komponenten auftreten. Das können Inkompatibilitäten in den verwendeten Nachrichten- oder Datenformaten sein oder auch Fehler in den Daten an sich – zum Beispiel ungültige Ein- und Ausgabeparameter, die eine Funktion plötzlich aus dem Tritt bringen.

Komplett unverzichtbar werden Integrationstests spätestens dann, wenn die eigenen Dienste auf externe Systeme angewiesen sind. Ein typisches Szenario ist die Anbindung an Webapplikationen wie Facebook, Twitter & Co. bzw. die Verwendung ihrer APIs, Protokolle und Datenformate für ein eigenes Webprojekt.

Der von //SEIBERT/MEDIA entwickelte Ego-Tracking-Dienst TwentyFeet ist ein klassisches Beispiel für eine Anwendung, bei der Integrationstests unverzichtbar sind, da die Schnittstellen diverser Online-Dienste zur Kommunikation mit diesen Applikationen benötigt werden. Um auf Änderungen seitens dieser Dienste schnell reagieren zu können, bieten regelmäßige und automatisiert ausgeführte Integrationstests eine Möglichkeit, Probleme kurzfristig zu entdecken und gezielt zu beheben.

Strategien zur Durchführung von Integrationstests

Im Laufe der Zeit haben sich in der Praxis verschiedene Strategien zur Durchführung von Integrationstests etabliert – jede davon mit ganz eigenen Vor- und leider auch Nachteilen. Um Letztere etwas abzumildern, kommen die Verfahren häufig sogar gekoppelt zum Einsatz. Zwei weit verbreitete Integrationsstrategien sind diese:

  • Top-down: Die in den höchsten Abstraktionsschichten befindlichen Komponenten werden zuerst getestet und die darunterliegenden durch sogenannte Mock- bzw. Dummy-Objekte simuliert. Gerade zu Beginn ist die Entwicklung dieser Platzhalter relativ aufwendig. Als Belohnung erhält man jedoch schnell ein erstes Bild vom Gesamtsystem und kann die Entwicklung der fehlenden Komponenten schrittweise vorantreiben.
  • Bottom-up: Schritt für Schritt werden einzelne bereits fertige Komponenten verknüpft und getestet, sodass am Ende das gesamte System abgebildet wurde. Auf Dummy-Objekte wird zwar komplett verzichtet, auf die Chance einer frühzeitigen Simulation des Gesamtsystems allerdings ebenfalls. Kommt es dann beim späteren Zusammenfügen der Teile zu Problemen, können Lokalisierung und Korrektur der Fehler recht aufwendig werden.

Wer sich nicht zwischen zwei so gegensätzlichen Strategien entscheiden will, greift gerne auf Taktiken wie Hardest-first zurück, bei der die risikoreichsten bzw. kompliziertesten Komponenten zuerst integriert werden. Mit jeder weiteren Komponente werden diese dann indirekt erneut überprüft und so mit der Zeit zu den am intensivsten getesteten Teilen des Gesamtsystems.

Auf noch exotischere Integrationsstrategien wie etwa Big bang wollen wir hier nicht weiter eingehen, da sie sehr selten Anwendung finden und nur in Spezialfällen die beste Wahl sein dürften.

Vorteile und Herausforderungen

Das Schöne an Integrationstests ist nicht nur die Tatsache, dass bestehende Unit-Test-Systeme weiterhin genutzt werden können und keine neuen Systeme etabliert werden müssen, sondern vor allem die unkomplizierte Entwicklung der eigentlichen Tests. Will man nicht auf einen spezialisierten Test Engineer zurückgreifen, kann auch ein Programmierer mit Erfahrung in der Entwicklung von Unit-Tests die Aufgaben übernehmen.

Gerade diese Ähnlichkeit zwischen beiden Testverfahren stellt jedoch gleichzeitig eine große Herausforderung dar. In der Praxis lässt sich immer wieder beobachten, dass Entwickler eigentlich einen Unit-Test erstellen wollen, aber am Ende einen Integrationstest vor sich haben.

Zugespitzt kann man sogar sagen, dass bei jeglicher Einbindung externer Systeme bzw. Komponenten oder bei einem Zusammenspiel zwischen mindestens zwei Komponenten desselben Systems schon ein Integrationstest vorliegt.

Aber warum ist die Unterscheidung der beiden Testverfahren so wichtig? Ganz einfach: Unit-Tests müssen definitionsgemäß sehr schnell sein, da sie von den Entwicklern relativ häufig und schon bei kleinen Änderungen im Code zur Überprüfung eingesetzt werden. Integrationstests sind naturgemäß deutlich langsamer, da sie auf externe Komponenten angewiesen sind und auch nicht ständig ausgeführt werden müssen.

Führen Änderungen im Code nun immer wieder zu gescheiterten Unit-Tests – die ja eigentlich Integrationstests sind – und fressen diese Tests auch noch unnötig viel Zeit, wird leider allzu gern das gesamte Unit-Test-System über Bord geworfen. Eine saubere Trennung der beiden Testverfahren könnte einer solch unnötigen Ablehnung erfolgreich entgegenwirken.

Nachfolgende Grafik soll die gerade beschriebenen Zusammenhänge nochmals schematisch verdeutlichen:

Die Grafik verdeutlicht noch eine weitere Herausforderung bei der Arbeit mit Integrationstests: Mit zunehmender Komponentenanzahl steigt die Menge an durchzuführenden Tests drastisch an. Neben einem geeigneten Testplan stellt eine automatisierte Qualitätssicherung - etwa durch Continuous Integration - eine geeignete Maßnahme dar, um mit der wachsenden Komplexität fertigzuwerden.

Fazit

Was Unit-Tests für einzelne Komponenten sind, sind Integrationstests für das Gesamtsystem: Ein unverzichtbares Mittel, um Qualität und Funktionalität des Codes jederzeit gewährleisten und im Falle eines Problems sofort reagieren zu können.

Leider haben auch Integrationstests ihre ganz eigenen Tücken, mit denen man zwangsläufig konfrontiert wird und die man zwar nicht überbewerten, aber auch nicht unterschätzen sollte. Wer sich für die am besten zum Projekt passende Strategie entscheidet, einen systematischen Testplan entwirft und die Grenzen zwischen den diversen Testverfahren nicht verschwimmen lässt, hat die Tücken erkannt, umschifft und wird vom Einsatz der Integrationstests signifikant profitieren.

Weiterführende Informationen

Ihr neues Projekt soll mit neuesten Techniken entwickelt werden? Sie möchten ein bestehendes System erweitern oder eine Software-Plattform migrieren? Sie benötigen Schnittstellen zwischen Anwendungen im Unternehmen? Und bei all dem muss höchste Qualität jederzeit gewährleistet sein?

Dann ist //SEIBERT/MEDIA der richtige Partner für Sie. Wir legen größten Wert auf Erweiterbarkeit, Performanz, Skalierbarkeit, Plattformunabhängigkeit und Testbarkeit und schaffen so individuelle High-End-Software-Lösungen, die sich auch im Nachhinein flexibel ausbauen und verändern lassen. Bitte sprechen Sie uns unverbindlich an! Ausführliche Informationen finden Sie auch in unserem öffentlichen Wiki: Einstieg in die Software-Entwicklung mit //SEIBERT/MEDIA.

Software-Tests: Notwendigkeit und Arten des Testens
Akzeptanztests in Scrum-Projekten
Unit-Tests in der Software-Entwicklung

Minimalistischer Artikel zur Thematik in Wikipedia
Eintrag zu Integrationstests in der Enzyklopädie der Wirtschaftsinformatik
Verschiedene Integrationsstrategien im Überblick


Mehr über die Creative-Commons-Lizenz erfahren