Software-Test / Testautomatisierung

Testautomatisierung auf dem Vormarsch!

Die immer wichtigere Rolle der Automation im Softwaretest

Softwaretesten hat sich als ein zentrales Element in der Software-Entwicklung etabliert, und im Zuge dieser Entwicklung gewann auch die automatisierte Unterstützung des Software-Tests immer mehr an Bedeutung. Zeit- und Kostenersparnis sind hierfür starke Beweggründe, und Testautomatisierung ist aus der heutigen IT-Landschaft kaum mehr wegzudenken.

Testautomatisierung

Der Einsatz von Automatisierungswerkzeugen wird bereits in der Konzeptionsphase eines Testprojektes geplant, damit die Werkzeuge ein Testvorhaben möglichst sinnvoll unterstützen, denn die Palette der Werkzeuge sowie deren Einsatzgebiete sind groß. Anwendungen reichen von State-of-the-Art-Software-Entwicklungsmethoden wie Test-Driven Development über automatisierte Integrationstests bis hin zu automatisierten System- und Systemintegrationstests über grafische und andere Nutzerschnittstellen.

Erfahrungsgemäß gibt es auch weniger erfolgreiche Automatisierungsvorhaben, die unverhältnismäßig hohe Kosten aufgrund eines hohen Wartungsaufwand und somit Ärger und Frustration verursachen. Dieser Artikel zeigt einige Gründe für das Scheitern solcher Projekte auf und soll so das Bewusstsein für die Möglichkeiten, aber auch die Grenzen von Testautomatisierung und den damit verbundenen Tools schärfen.

Funktionsweise der Testautomatisierung

Testautomatisierung war bzw. ist eine Nische der Software-Entwicklung. Im Falle von Automatisierung über die Benutzeroberfläche wird im Allgemeinen eine spezialisierte Entwicklungsumgebung für eine Skriptsprache bzw. an eine gängige Programmiersprache gebundene Umgebung mit vorgefertigten Aktivitäts- und Aktionsbausteinen genutzt. Die Tools greifen auf Schnittstellen der Applikation zu. In vielen Fällen sind dies die Komponenten der Benutzeroberfläche (Buttons, Textfelder, Bäume, Tabellen etc.).

Eine Auswahl von ähnlichen Testfällen, die einem gemeinsamen Ablauf folgen, wird zu einem allgemeinen Schema bzw. einer Menge von Abläufen, die aus einigen Schlüsselaktivitäten bestehen, abstrahiert.

Diese Schemata und Abläufe werden nun, oftmals unter der Zuhilfenahme von Aufzeichnungsfunktionalität der Automatisierungstools, in Skripte umgesetzt, die mittels Spreadsheets oder einer Datenbank steuerbar sind. Anders gesagt: Testfallvarianten, die sich nur in den Daten unterscheiden, können datengesteuert automatisiert werden. Das Testteam liefert Steuerdaten, die für diese Skripts die konkreten Testfälle enthalten, die mithilfe dieser Skripten automatisch durchgeführt werden können.

Doch was ist der Nutzen von automatisierten Tests?

Im Entwicklertest ermöglicht die Automatisierung dem Entwicklungsteam, rasch eine Aussage über die Funktion der einzelnen Softwarebausteine zu treffen. Dieses Sicherheitsnetz erlaubt es, auch größere Änderungen vorzunehmen, ohne Angst vor unerwarteten Verschlechterungen zu haben.

Auch dem spezialisierten Testteam nutzt Automatisierung: Abgesehen von einem weiteren Sicherheitsnetz bietet sie die Möglichkeit, die Tester von repetitiven Aufgaben zu befreien. Dies kann beispielsweise in iterativ-inkrementellen Vorgehensmodellen wie Scrum erreichen, dass Testspezialisten von ermüdenden Regressionstests frei gespielt werden und sich auf die aktuell relevante Funktionalitäten konzentrieren zu können. Hier ist der Zweck von Automatisierung also nicht, Fehler zu finden. Vielmehr ist es ihre Aufgabe zu bestätigen, dass die bereits fertige Funktionalität nicht durch Änderungen beeinträchtigt wird!

Nicht zuletzt nutzt die Testautomatisierung auch den Projektauftraggeber bzw. Projektverantwortlichen, da Regressionstest häufiger, kosteneffizienter und vor allem auch reproduzierbarer als von manuellen Testern durchgeführt werden kann. Das trägt wiederum zu einer verringerten Fehleranzahl nach dem Release bei.

Viele scheitern bereits zu Beginn – oder sogar davor!

Warum ist dann nicht in jedem Projekt eine automatisierte Testunterstützung anzutreffen? Im Komponententest gehört es zum guten Ton, zumindest einige unsystematisch erstellte Testfälle automatisiert zu haben – doch im Integrationstest und spätestens beim automatisierten Systemtest fällt der Anteil von erfolgreich eingesetzter Testautomatisierung deutlich geringer aus. Diese Diskrepanz hat mehrere Gründe: Zunächst bedeutet Testautomatisierung ein Investment, das erst über einen längeren Zeitraum den entsprechenden Return bringt. Die Automatisierung eines Testfalls ist aufwendiger als eine einzelne Durchführung und ein effektiver Nutzen kann daher erst nach mehreren Durchläufen erreicht werden. Die für den Start notwendigen Ressourcen können den Blick auf den langfristigen Nutzen trüben.

Ein weiterer Faktor betrifft eine weit verbreitete und grundlegend falsche Erwartungshaltung gerade gegenüber kommerziellen Werkzeugen: Es werden Tools in der Hoffnung angeschafft, dadurch eine ausreichende Grundlage für eine erfolgreiche Testautomatisierung zu erhalten. Ist ein Werkzeug angeschafft, wird das Automatisieren als Nebentätigkeit eines unerfahrenen (und nicht selten damit überforderten) Testers gesehen. Das führt zu Basteleien im sprichwörtlichen „stillen Kämmerlein“, ohne eine klare Zielvorgabe oder Struktur. So wächst, abseits von Entwicklung und manuellem Test, ein unwartbares, kaum durchführbares und schwer analysierbares Flickwerk, das technische und fachliche Aspekte vermischt. Testläufe werden nach Belieben durchgeführt und die Ergebnisse nicht klar kommuniziert. Oft wird in diesen Fällen für den Misserfolg das Werkzeug verantwortlich gemacht, und sowohl Werkzeug als auch Automatisierung „verstauben“ ungenutzt.

Testautomatisierung_Robot

Spezielle Qualifikation für Testautomatisierer ist unabdingbar

Auch wenn viele Tool-Hersteller ihre Tools als „Record and Play“-Tools darstellen, mit denen auch Personen ohne jegliche Programmiererfahrung sofort Automatisierungssuiten erstellen können, so bedarf es im realen Einsatz meistens einiger Erfahrung im Gebiet der Softwareentwicklung. Viele der Automatisierungswerkzeuge betten ihre Skripte in eine grafische Oberfläche ein, die z.B. mit Listen und Bäumen Abläufe definiert. Zu beachten ist allerdings die Tatsache, dass diese Darstellungen im Grunde nichts anderes als eine optische Aufbereitung des eigentlichen Programmcodes ist. Das heißt, dass auch bei dieser Darstellung dieselben Probleme und Fragestellungen auftreten, wie etwa Was passiert, wenn während des Testdurchlaufs ein Fehler auftritt?“ und Was geschieht, wenn dieser Fehler nicht an der Applikation, sondern im Skript liegt?“.

Eine häufige Fehleinschätzung bei der Entscheidung für automatisierte Testunterstützung ist, dass eine Ausbildung als Tester ausreichend für die Rolle als Testautomatisierer ist. Für die Entwicklung von Testautomatisierungssystemen ist Wissen über Prozesse und Methodik im Testbereich zwar wichtig, im Regelfall aber selten ausreichend. Um ein Testautomatisierungssystem zu entwerfen und umzusetzen, sind auch Kenntnisse und Erfahrungen in der Entwicklung von Softwaresystemen an sich notwendig. Besonders gilt dies, wenn dieses System langfristig und flexibel nutzbar sein soll. Das Fehlen entsprechenden Know-hows äußert sich, wie es aus dem Bereich der Softwareentwicklung bereits hinreichend bekannt ist: Unwartbarer, instabiler, ineffizienter und schlecht skalierender Code entsteht. Erfahrung mit Entwicklung, Test und den verwendeten Tools sind daher nicht nur von Vorteil, sondern für den Erfolg eines solchen Projekts in hohem Maße ausschlaggebend.

Das Werkzeug muss zum Nutzer und zu den Zielen passen

Eine gute Werkzeugauswahl ist notwendig, aber nicht allein ausreichend für Erfolg. Bei der Entscheidung für ein Tool sollten nicht nur die technische Kompatibilität und der Preis entscheidend sein: Ein mindestens genauso wichtiges Kriterium ist das Zueinanderpassen von Zielsetzung, Werkzeug und Nutzer.

In einen Projekt mag es möglich sein, Werkzeuge einzusetzen, die Programmierkenntnisse in spezifischen Sprachen erfordern, in anderen wiederum ist eine grafische Gestaltung der Testfälle absolut notwendig. Daher empfiehlt sich vor der Entscheidung ein Probelauf am lebenden Objekt – am besten in Form eines Proof-of-Concepts mit den zukünftigen Anwendern und anhand der definierten Ziele.

Ein weiterer Aspekt ist die Einführung von Werkzeug und den damit verbundenen Prozessen: Was ist der Input für die Automatisierung und was der erwartete Output? Wer formuliert die Testfälle, wer implementiert sie? Wann und wie oft werden die automatisierten Testfälle durchgeführt? Wie werden Ergebnisse kommuniziert? All diese Fragen sollten bewusst beleuchtet werden, um die entstehenden Strukturen nicht dem Zufall zu überlassen.

Weichen müssen richtig gestellt sein!

Wie bei allen Investments in Software-Entwicklungsvorhaben – und zu diesen zählen Testautomatisierungsprojekte, selbst wenn Testfälle ohne Programmierkenntnisse erstellbar sind – müssen auch bei der Testautomatisierung von Anfang an die Weichen richtig gestellt werden. Aber auf der anderen Seite sollte auch während des laufenden Einsatzes immer wieder beobachtet und nachjustiert werden, um langfristig den erhofften Ertrag – und möglicherweise noch etwas mehr – ernten zu können. Ein klares Konzept, ein strukturiertes Vorgehen und eine überlegte Einbettung in den allgemeinen Software-Entwicklungsprozess können Testautomatisierern helfen, ihre Aktivitäten gewinnbringend zu fokussieren.

Wenn es um die technische Umsetzung geht, ist eine gute Strukturierung der Automatisierungselemente, z.B. mithilfe von Keyword-Driven Test Automation, und ein Blick auf Wartbarkeit der automatisierten Testfälle essenziell. Nicht zuletzt spielt die Testbarkeit der Zielapplikation eine wichtige Rolle: Das geht von eindeutigen Erkennungsmerkmalen auf der Benutzeroberfläche bis hin zu allgemeinen Hilfsmitteln, wie zum Beispiel dem Rücksetzen einer Testumgebung in einen Initialzustand. Um die Testbarkeitsanforderungen an das zu testende System nachhaltig zu ermitteln, eignet sich einerseits eine Aufnahme dieser Anforderungen bereits von Beginn an. Im Idealfall wird diese Betrachtung gekoppelt mit einem möglichst frühen testweisen Einsatz der Testautomatisierung (Proof of Concept, Pilot), um gegebenenfalls noch nicht erfasste und sich im realen Umfeld zeigende Notwendigkeiten rechtzeitig ergänzen zu können. Auf der anderen Seite sollte der Zeitpunkt eines solchen Einsatzes aber auch nicht verfrüht stattfinden: Das zu testende System sollte hier einen dem Ansatz und der Teststufe entsprechenden Reifegrad bereits erreicht haben, um der Automatisierung zu ersparen, ein „Moving Target“ anzupeilen.

Unzureichende Planung und Konzeption von Testautomatisierungsvorhaben

Viele Probleme in der Testautomatisierung bestehen oder entstehen bereits während der Planungsphase:

  • Entscheidungen über die Architektur des Automatisierungssystems und eine überlegte Auswahl von Testfällen, deren Automatisierung zum Ziel gesetzt wird, sind in der Testautomatisierung besonders kritisch.
  • Fehlende Unterstützung durch andere Projektbeteiligte:  Management, Entwickler, Tester und Fachbereich müssen erst von der Sinnhaftigkeit der Automatisierung überzeugt werden.
  • Die nötigen Ressourcen, insbesondere Zeit, sollten ausreichend vorhanden sein, da es sonst für den Automatisierer schwer ist, sich mit der zu testenden Applikation fachlich und technisch mit ausreichendem Tiefgang auseinanderzusetzen.
  • Analysen der Anforderungen oder Spezifikationen für das automatisierte System fehlen oft vollständig, wenn man von den Testfällen absieht, deren Automatisierung geplant ist.
  • Der dafür anfallende  Aufwand darf nicht außer Acht gelassen werden, sonst besteht die Gefahr, dass Zweck und Umfang des Automatisierungssystems missverstanden werden und somit die Entwicklung des Automatisierungssystems an den eigentlichen Bedürfnissen des Tests vorbeigeht.
  • Erfahrungsgemäß wird, wie auch aus der Softwareentwicklung bekannt, die Komplexität des Vorhabens selbst oft unterschätzt. Was als einfaches System mit einigen, wenigen Proof-of-Concept-Testfällen beginnt, wächst oft sehr schnell, und Teile des Systems finden Wiederverwendung in anderen Bereichen.

Testautomatisierungssysteme fordern ihre Erweiterung ein: Gefundene Fehler im automatischen oder manuellen Test oder gar im produktiven Einsatz fordern dann neue Testfälle, die ebenfalls automatisiert werden sollen. Um das System ausreichend skalieren und erweitern zu können, ist daher eine wohlüberlegte Architektur notwendig.

Im Bereich der Testautomatisierung gibt es hierfür einige Ansätze, deren Verwendung in Betracht gezogen werden sollte. Methoden und Techniken wie beispielsweise Data-, Keyword- oder Behaviour Driven Development werden mittlerweile durch zahlreiche Werkzeuge unterstützt und sind mit beinahe jeder Technologie gut einsetzbar. Durch den konsequenten Einsatz dieser Methoden kann ein hoher Wartungsaufwand weitgehend vermieden und die Skalierbarkeit des Automatisierungssystems sichergestellt werden.

Ein weiterer wesentlicher Aspekt, der mittlerweile von einigen Tools berücksichtigt wird, ist die parallele Ausführung von Testfällen. In diesem Kontext ist nicht nur die technische Aufteilung der Testdurchführung eine Herausforderung, sondern vor allem auch die damit verbundenen, inhaltlichen Themen wie z.B. Testdatenmanagement (insbesondere Testdaten mit fachlichen Zustandsmodellen dahinter) und Testkonfiguration (wie beispielsweise Testfälle, die das zu testende System unter bestimmten Parametern betesten müssen).

Fehlende Integration in den Entwicklungsprozess

Ein wesentlicher Aspekt für den nachhaltigen Erfolg von Testautomatisierungsvorhaben ist die Integration in einen Entwicklungsprozess. Wird dieser Punkt nicht beachtet, führt das oft zu isolierten Automatisierungslösungen deren Nutzen nicht im vollem Umfang wahrgenommen wird oder auch unrealistische Erwartungen an sie gestellt werden. Um dies zu verhindern, gibt es, abhängig vom eingesetzten Entwicklungsvorgehen, unterschiedliche Ansatzpunkte:

  • Continuous Integration / Continuous Delivery
  • Betrieb (z.B. Provisionierung der Testumgebung)
  • Fehlermanagement Planung, Priorisierung und Schätzung

Die Integration sollte dabei so weit gehen, dass es beispielsweise nicht nur einem Testautomatisierer möglich ist einen Testlauf zu starten. Optimal funktioniert die Zusammenarbeit nämlich dann, wenn von beliebigen Projektmitarbeitern ein Testlauf auf dedizierten Testumgebungen gestartet werden kann, ohne zuvor eine Vielzahl von Mitarbeitern um Erlaubnis bzw. Unterstützung zu fragen. Neben Entwicklern profitieren auch der Betrieb, Fachbereichsmitarbeiter sowie vor allem auch der Kunde von dieser Möglichkeit.

Testautomatisierung_Imagebild © Photosandmore.at

Agile – nicht ohne Testautomatisierung

Gerade in den derzeit stark verbreiteten agilen Vorgehensmodellen ist ein hoher Automatisierungsgrad eine Voraussetzung für den Projekterfolg. Aufgrund der kurzen Iterationszeit, häufigen Releases und häufigen Änderungen auch in fortgeschrittenen Projektphasen, ist ein ausführlicher Regressionstests notwendig. Wird diese Qualitätssicherungsmaßnahme nicht eingesetzt besteht die Gefahr, dass neue Änderungen bereits bestehende Funktionalität beeinflussen und Fehler möglicherweise Fehler induzieren. Da diese Änderungen allerdings sehr häufig durchgeführt werden, ist der Aufwand für manuelle Regressionstests in diesen Projekten oft nicht tragbar und sollte daher automatisiert bzw. teilautomatisiert werden.

Wird eine kontinuierliche Auslieferung (kontinuierliche Integration & kontinuierliche Bereitstellung am Produktivsystem) praktiziert ist die Testautomatisierung noch mehr von Bedeutung und sollte daher noch mehr forciert werden.

Nichterfüllung der Voraussetzungen für Testautomatisierung in der Applikation

Wie bereits beschrieben, gibt es drei wesentliche Anschlusspunkte der automatischen Testdurchführung:

  • Zugriff des Tools auf Schnittstellen der Applikation, die getestet werden soll
  • ein effektiver Testansatz
  • ein gewisser Reifegrad der zu testenden Applikation und ihrer Umgebung

Diese Punkte sehen auf den ersten Blick recht unempfindlich aus: Schnittstelle ist in unserem Fall die Benutzeroberfläche, von der ohnehin erwartet wird, dass sie einerseits bedienbar und andererseits auch logisch und konsistent ist. Schemata im Ablauf der Testfälle sind eine weitere, Usability-unterstützende Eigenschaft, die von vielen Applikationen erfüllt werden soll. Allerdings ist hier leider nicht alles Gold, was glänzt: Gerade in diesen Bereichen sind einerseits Tools sehr empfindlich, andererseits sind sie der Fokus von Weiterentwicklungen von Software. Grafische Neugestaltungen von Applikationen etwa, die an der eigentlichen Funktionalität nichts ändern, verursachen Wartungsaufwand für Automatisierer oder Erweiterungen um Schnittstellen für die Automatisierung durch die Entwickler. Selbiges gilt auch für Umgestaltungen der Abläufe in der zu testenden Applikation. Soll die Automatisierungssuite nachhaltig und über einen längeren Zeitraum eingesetzt werden, kann hier erheblicher Wartungsaufwand entstehen.
Verletzungen des dritten Punktes treten meist zusammen mit Verletzungen der ersten zwei Punkte auf, allerdings kann auch eine Applikation, deren Gestaltung und Ablaufdesign als fertig betrachtet werden, an mangelndem Reifegrad leiden. Daraus resultiert, dass die Protokolle von automatischen Testdurchläufen wenig aussagekräftig sind, da die Fehler die Ausführung vieler Testfälle verhindern. Eine weitere Konsequenz besteht darin, dass das Auftreten der aufgezeigten Fehlerwirkungen für eine sinnvolle Auswertung zu häufig ist oder nicht reproduziert werden kann.

Testautomatisierung – der falsche Ansatz?

In der Testautomatisierung ist wie auch in vielen anderen Bereichen der Grundsatz zu beachten:  Nur weil man etwas automatisieren kann, muss man es nicht zwangsweise automatisieren.

Wie bereits beschrieben, ist die Automatisierung von Testfällen nicht in jeder Situation empfehlenswert bzw. teilweise überhaupt nicht realisierbar. Automatisierte UI-Tests auf mobilen Endgeräten ist hierfür ein aktuelles Beispiel.

In diesem Fall muss man eventuell auch auf andere Ansätze zurückgreifen, um den Testaufwand in einem überschaubaren Rahmen zu halten. Eine Alternative ist zum Beispiel das Crowdtesting. Dabei kann eine Vielzahl von unterschiedlichen Geräten in relativ kurzer Zeit und zu geringen Kosten getestet werden. Zusätzlich erhält man auf diese Weiße auch effizient Feedback zu nichtfunktionalen Eigenschaften wie der Benutzbarkeit oder der Zuverlässigkeit. Dessen ungeachtet sollte Crowdtesting nicht als reine Alternative zu Testautomatisierungsvorhaben angesehen werden, sondern diesen unterstützend begleiten.

Einfach ist es nicht. Aber wirkungsvoll!

Wenn diese Aspekte entsprechend Berücksichtigung finden, stehen die Chancen gut, eine stabile Testautomatisierung zu schaffen und diese auch effizient zu nutzen. Einfach ist es allerdings nicht. Wie so oft kann aber auch hier die Erfahrung anderer genutzt werden: Testautomatisierer aus dem eigenen Umfeld, externe Beratung durch Experten, einschlägige Lektüre oder Foren und Communities können zu Beginn helfen, die wichtigen ersten Schritte in die richtige Richtung zu setzen.

Erste Schritte in Richtung eines erstrebenswerten Ziels: Das „Freispielen“ von Testern, die sich dadurch darauf konzentrieren können, neue und wichtige Fehler zu finden (anstatt mühevoll immer wieder die gleichen Regressionstestfälle durchzuackern), ist wahrscheinlich das zentrale Qualitätsmerkmal effektiver Testautomatisierung, und stellt für Projekt und Produkt einen wesentlichen  Hebel zur Qualitätsverbesserung dar.

Testautomatisierung ist ein Sichernetz

Testautomatisierung_Die Fehlerfindung innerhalb der verschiedenen Testarten (Quelle: Mark Fewster, ANECON Expertenfrühstück, 14.03.2012)

Die Fehlerfindung innerhalb der verschiedenen Testarten
(Quelle: Mark Fewster, ANECON Expertenfrühstück, 14.03.2012)

Auf den ersten Blick mag die Fehlerfindungsquote von 9% im automatisierten Test gering erscheinen, die aussagekräftige Zahl sind jedoch die 58% im explorativen Test: Testautomatisierung ist ein Sicherheitsnetz, aber kein vorrangiges Instrument, um die Fehler zu finden. Was automatisiert ist, hat schon mal richtig funktioniert – hier werden nur im Nebeneffekt Fehler identifiziert. Der größere Teil der Fehler wird im manuellen, explorativen Test gefunden, für welchen der Tester viel Zeit aufwenden muss. Testautomatisierung schafft also Raum für den „kreativen“ Test, da das Testteam mehr Zeit hat und die menschliche Kreativität und Testintelligenz genau dort eingreifen, wo der Fehler passiert. Das Ziel der Testautomatisierung ist somit nicht vorrangig, im Testteam einzusparen, sondern mehr Zeit zu schaffen, um sich neben der automatischen Regression wieder dem methodischen, „menschlichen“, manuellen Test zu widmen.

Fazit

Testautomatisierung ist ein Teilbereich der Software-Entwicklung und des Software-Tests, der sich spezialisierter Tools bedient und auch ein Bindeglied zwischen den Disziplinen darstellen kann. Für eine erfolgreiche Automatisierung ist Mehraufwand zu Beginn notwendig, der allerdings bei guter Planung und kompetenter Umsetzung zu wesentlicher Verbesserung und Effizienzsteigerung des Tests führt. Professionelle Testautomatisierer, die mindestens über Grundkenntnisse im Bereich der Software-Entwicklung und über Vorgehensweisen und Prozesse im Test verfügen, sind für die Umsetzung nötig. Im Idealfall bringen sie umfangreiche Erfahrung im Bereich der Testautomatisierung mit. Voraussetzung für eine gute Testautomatisierung ist ein Reifegrad der Entwicklung, der dem Rahmen der Testautomatisierung entspricht. Unterstützung durch Management, Entwicklung und Testteam sind ebenfalls wichtige Punkte, deren Bedeutung nicht unterschätzt werden darf.

Passende Artikel

Kommentare gesperrt.