Benjamin Bürgisser
IT Architect
Blogserie | Agile Integration | #4
Sowohl die Entwicklung als auch die Integration von Services werden zunehmend agil und dezentralisiert. Systeme befinden sich dabei in stetigem Wandel und müssen trotzdem jederzeit einsatzbereit sein. Damit sich mit der höheren Geschwindigkeit und Flexibilität nicht genauso schnell Fehler und Inkompatibilitäten ergeben, ist ein automatisiertes Vorgehen beim Testen unerlässlich.
Autor: Benjamin Bürgisser
In der alten IT-Welt mit ihren fixen Projekt-Phasen fand das Testing meist strikt nach der Entwicklung und unmittelbar vor der Auslieferung statt. Oft kam dabei ein separates Team zum Einsatz, welches nicht in die Entwicklung involviert war. Einige manuelle End-to-End Tests später war dann klar: Diese Lösung funktioniert noch nicht.
Mit zunehmender Geschwindigkeit rücken diese altgedienten Software-Lebenszyklen und festgelegte Release-Daten in den Hintergrund. Planung, Entwicklung, Test und Auslieferung eines Service geschehen nicht mehr in voneinander getrennten Phasen, sondern werden kontinuierlich und oft von einem einzigen DevOps-Team durchgeführt (siehe Abbildung 1). Und da sich einzelne Services und Softwarekomponenten selten in einem Vakuum befinden, wird die agile Integration immer wichtiger. Systeme und deren Komponenten entwickeln sich unabhängig voneinander weiter, befinden sich in unterschiedlichen Entwicklungsstadien und müssen doch stets miteinander interagieren können. Um mehr über die agile Integration und ihre Erfolgsfaktoren zu erfahren, empfehlen sich an dieser Stelle die Beiträge von Thomas Stuber: Formen der agilen Integration - eine Auslegeordnung und 5 Learnings zur agilen Integration. Ein besonders wichtiger Faktor für die agile Integration ist deren Dezentralisierung. Wie diese durch Integration als Microservice erreicht werden kann, ist dem folgenden Beitrag von Oliver Faust zu entnehmen: Integration as a Microservice.
Die Vorteile des agilen Vorgehens liegen auf der Hand: Softwaresysteme sind schneller einsatzbereit, mögliche Defizite werden früher erkannt, veränderte Anforderungen und neue Kundenwünsche werden sofort berücksichtigt und Fehler sind schneller beseitigt.
Doch genau diese Geschwindigkeit birgt auch Gefahren. Ohne geeignete Massnahmen befinden sich nicht nur die gewünschten Funktionen und Verbesserungen schneller in der produktiven Umgebung, sondern auch unerwünschte Nebeneffekte und Bugs. Die Beseitigung eines Fehlers verursacht einen neuen an einer anderen Stelle, die Integration eines neuen Features macht ein anderes unbrauchbar und die Anpassung der Schnittstelle für Service A verursacht einen Breaking Change für den Service B.
In der neuen agilen IT-Welt nimmt das Testing deshalb eine zentrale Rolle ein. Nur durch Tests kann sichergestellt werden, dass Software auch bei kontinuierlicher Veränderung stets ausführbar bleibt und auch weiterhin korrekt mit anderen Systemen interagiert. Durch separate Testing-Teams und manuell ausgeführte End-to-End Tests lässt sich ein solches Vorhaben aber kaum mehr bewerkstelligen. Neue Lösungen sind gefragt und getreu dem agilen Ansatz sind auch diese schnell angepasst, stets auf dem aktuellen Stand und jederzeit ausführbar.
Tests sollten also stets aktuell und relevant sein, Probleme früh aufdecken und vor allem bei jeder Änderung an der Code-Basis automatisch und schnell ausgeführt werden. Ein Code, der nicht lauffähig ist, Fehler enthält oder zu Breaking Changes bei den Abnehmern und Umsystemen führt, sollte gar nicht erst ausgeliefert und produktiv geschaltet werden können.
Es ergeben sich dadurch im Wesentlichen zwei Aufgaben:
Um die richtigen Tests zu schreiben kann die Testpyramide zu Rate gezogen werden. Diese ist in Abbildung 2 ersichtlich und empfiehlt eine hierarchische Vorgehensweise, um Probleme möglichst früh zu erkennen. Testverfahren auf den unteren Ebenen der Pyramide weisen die höchste Anzahl an Testfällen auf, werden früh in der Entwicklung erstellt und regelmässig ausgeführt. Tests auf den oberen Ebenen folgen erst später, sind aufwändiger, schwieriger zu automatisieren und üblicherweise in kleinerer Zahl vorhanden.
Unit Tests sind simple, einfach zu automatisierende Tests, welche die einzelnen Bestandteile einer Software (Units) isoliert voneinander prüfen. Abhängigkeiten werden durch Mocks ersetzt, um jegliche Einflüsse und Folgefehler anderer Units von der getesteten Einheit fernzuhalten. Bei Unit Tests handelt es sich um White-Box-Tests, wir kennen also die innere Funktionsweise unseres Systems und dessen Bestandteile.
Diverse Tools können bei automatisierten Unit Tests unterstützen. Hier die zwei wichtigsten:
Integrationstests ermöglichen die fehlerfreie agile Integration
Getestete und korrekt funktionierende Komponenten (Units) sind die Voraussetzung für Integrationstests, bei denen das korrekte Zusammenspiel voneinander abhängiger Services eines Gesamtsystems sichergestellt wird. An dieser Stelle wird der einzelne Service als Black-Box betrachtet. Es zählt also nicht mehr die korrekte innere Funktionsweise, die bereits durch die Unit Tests sichergestellt wurde. Stattdessen betrachten wir die Interaktion unseres Service mit anderen Services über die jeweiligen Schnittstellen.
Auch hier bieten sich diverse Tools als Unterstützung an:
Nachdem die Tests entsprechend der Testpyramide geschrieben sind, geht es nun darum diese automatisch auszuführen und damit zu verhindern, dass ein ungetesteter und potenziell fehlerhafter Code in den produktiven Build gelangt. Auch hier unterstützen verschiedene Tools:
Tests und Testautomatisierung als zentralen Erfolgsfaktor der agilen Integration mehr in den Fokus zu rücken, lohnt sich langfristig. Denn was zu Beginn nach Mehraufwand aussieht, zahlt sich später sowohl bei Qualität und Betriebsaufwand als auch Agilität bei Entwicklung und Integration mehr als aus.
Konkret ermöglichen wir durch automatisierte Tests:
Um diese Ziele zu erreichen, können wir folgende Massnahmen umsetzen:
#1 | Formen der agilen Integration - eine Auslegeordnung
#2 | 5 Learnings zur agilen Integration
#3 | Integration as a Microservice
#4 | Kontrollierte Risiken: Agile Integration erfordert automatisierte Tests
Sie möchten Ihr Unternehmen mit DevOps voranbringen, wissen aber noch nicht genau, wie Sie es angehen sollen?