Für das Risikomanagement eines Projektes sind frühe Tests ein Vorteil, den man gar nicht hoch genug einschätzen kann.
Bei der Software-Entwicklung unterscheidet man in der Regel vier Teststufen: Unit-, Integrations-, System- und Abnahmetest. Als frühestmögliche Teststufe bringen Unit-Tests schon von Anfang an hohe Qualität in den Software-Entwicklungsprozess und verringern dadurch die Kosten für die Fehlerbehebung. Der Vorteil der Testmethode: Einzelne Softwarebausteine können isoliert getestet werden; ermittelte Fehler lassen sich somit nicht nur früher finden, sondern ihre Ursache auch leichter einer Komponente zuordnen. Aber wie setzt man sie auf dem Mainframe optimal ein?
Das Testen von Software ist prinzipiell zeitaufwendig. Das trifft natürlich genauso auf Mainframes zu. Leider werden notwendige Funktionstests aus Zeitmangel oftmals nach hinten verschoben. Zugrunde liegt die irrige Annahme, der Gesamtaufwand sei geringer, wenn nicht schon während der Entwicklung systematisch getestet werden muss, sondern erst nach der Fertigstellung der Software. Dass dies ein Trugschluss ist, zeigt sich erst, wenn im Abnahmetest Fehler entdeckt werden – vor allem dann, wenn es sich um Fehler im Design oder in den Anforderungen handelt.
Im Gegensatz zu simplen Programmierfehlern erfordern solche Probleme für eine zukunftsorientierte Lösung fast immer eine umfassendere Analyse und Korrektur der Konzeption. Meist reicht aber die Zeit nicht mehr für grundlegende Korrekturen und selbst neue Anwendungen gehen dann schon mit „technischen Schulden“ in Produktion.
Grundsätzlich gilt: Je später die Anforderungen oder das Design einer Software korrigiert werden, desto weiter muss man in der Konzeption zurückgehen und bereits Erreichtes wieder verwerfen. Diese Mehrfacharbeit verschlingt Budget, das andernfalls für mehr Funktionalität zur Verfügung stehen könnte.
Für das Risikomanagement eines Projektes sind frühe Tests ein Vorteil, den man gar nicht hoch genug einschätzen kann. Fehler, die erst kurz vor der geplanten Produktivsetzung entdeckt werden, können insbesondere bei Fixterminen wie z.B. gesetzlichen Änderungen ein hohes Risiko darstellen.
Im Vergleich zu Systemtests ermöglichen Unit-Tests, die Kosten für die Fehlerbehebung um bis zu 80 Prozent zu senken, da Fehler schon viel früher gefunden werden. Zudem führt dies dazu, dass die Software stabiler in den Abnahmetest geht und dort weniger Aufwand verursacht.
Um der Problematik mit den hohen Kosten für spät entdeckte Anforderungs- und Designfehler beizukommen, setzen sich inzwischen auch im Mainframe-Umfeld immer mehr dieser Vorgehensmodelle durch, die durch einen inkrementell-iterativen Ansatz möglichst früh das Erkennen und Beheben von Fehlern ermöglichen wollen. In der agilen Software-Entwicklung ist es ein Grundprinzip, möglichst schnell und flexibel auf Probleme einzugehen und Software zu entwickeln, die dem Kunden einen noch höheren Nutzen bringt. Hierfür ist es aber wichtig, in jeder Iteration Tests auszuführen, um auf diese Weise sicherzustellen, dass sowohl die in der aktuellen Iteration implementierte Funktionalität (das Inkrement) als auch die bestehende Funktionalität korrekt sind.
Ein Ansatz ist, in jede Iteration eine vollständige Anwendung zu bauen und einen Systemtest durchzuführen. In großen Projekten, wie sie in Mainframe-Umgebungen typisch sind, stellt sich das jedoch oft als unrealisierbar heraus. Hier sind Tests auf Komponentenebene sinnvoll. Dabei sind Unit-Tests sowohl für die Entwicklertests als auch für Komponenten- und Integrationstests geeignet.
Eine bekannte Bank etwa hat das Thema schon vor Jahren erkannt, als dort begonnen wurde, agile Software-Entwicklung einzusetzen. Den Schlüssel dazu fand man in den Anforderungen an die Testbarkeit. Um diese zu erfüllen, sollten Unit-Tests eingesetzt werden. Um den Entwicklern das Testen mit der erforderlichen Effizienz zu ermöglichen, sollten hierzu keine handgeschriebenen Tests, sondern ein Tool verwendet werden. Eine Marktanalyse ergab zum damaligen Zeitpunkt, dass kein Standardtool verfügbar ist. Bei der Bank wurde daher ein eigenes Tool (der sog. „Function Tester“) entwickelt und aufgrund seines hohen Nutzens auch bis heute weiterentwickelt.
Dass die Kostenvorteile von Unit-Tests nicht nur theoretisches Zahlenspiel sind, zeigt auch die Analyse eines Projekts einer großen deutschen Bausparkasse. In einem iterativ-inkrementell umgesetzten Projekt, bei dem konsequent und regelmäßig Unit-Tests mithilfe des Standardtools Savvytest durchgeführt wurden, ging der Abnahmetest problemlos von der Hand. Um diese Tatsache sowie auch die positive Einschätzung der Projektmitarbeiter zu untersuchen, wurden die Aufwände für den Fachtest in Verhältnis zum Gesamtaufwand gesetzt und mit anderen Projekten vergleichbarer Größe und Komplexität verglichen, in denen Unit-Tests jedoch nicht so konsequent zum Einsatz kamen. Das Ergebnis: Der Anteil für die Fach- und Abnahmetest konnte um 75 Prozent reduziert werden. Dies ist besonders bedeutsam unter dem Aspekt, dass Fachexperten aufgrund ihrer starken Auslastung praktisch immer sehr wertvolle Ressourcen darstellen. Zudem haben die Projektmitarbeiter den Abnahmetest einvernehmlich als reibungsarm empfunden, weil die Qualität der Software von Anfang an hoch war.
Isolierte Unit-Tests durch Stubs
Stubs – auch Mockups genannt – ermöglichen es, Tests unabhängig von Umgebungsbedingungen durchzuführen, die oft schwer herzustellen sind. Dabei werden Komponenten außerhalb des Testobjekts simuliert, anstatt sie tatsächlich aufzurufen. Der Testaufwand kann so oft erheblich verringert werden.
Quelle: Savignano
Bildquelle: Thinkstock/iStock