Etwa 2.41 Milliarden Dollar kostet Software mit mangelhafter Qualität alleine in den USA. Dies hat das CISQ Consortium for Information & Software Quality in seinem Bericht über „The Cost of Poor Software Quality in the US: A 2022 Report“ festgestellt. Neben weiteren Fakten geht das Dokument auch auf technische Schulden ein. So verlieren Entwickler*innen noch immer etwa 33% ihrer Produktivzeit durch schlechten Code. Bei einer 40 Stunden Woche sind das mehr als 13 Stunden.

Doch wie können diese Zahlen verringert werden? Was lässt sich tun, um die Qualität der Software dauerhaft hochzuhalten und Fehler frühzeitig zu erkennen? Ein Hilfsmittel in der modernen Softwarenentwicklung ist die Testautomatisierung.

Testautomatisierung: Definition, Nutzen und Tools

Hinter dem Begriff „Testautomatisierung“ verbirgt sich ein großes Gebiet. Im Allgemeinen handelt es sich dabei um das Prüfen von Software mit Hilfe von Werkzeugen bzw. anderer Software. Dabei wird stets in drei Schritten vorgegangen:

  1. Vorbedingung erfüllen
  2. Testausführung
  3. Ergebnisvalidierung

Testautomatisierung findet in unterschiedlichen Stufen eines Testzyklus statt. Für jede Ebene gibt es unterschiedliche Werkzeuge, die sinnvoll eingesetzt werden können.

Ein Blick auf die Testpyramide hilft dies zu verdeutlichen:

Testpyramide: Übersicht über die verschiedenen Testarten

In der untersten Ebene, dem Komponententest oder auch Unittest genannt, werden die Einzelnen Abläufe und Teilfunktionen getestet. Hierbei kommen Werkzeuge wie Junit oder für andere Sprachen vergleichbare Bibliotheken zum Einsatz.

Eine Stufe höher werden die Komponenten zusammengesetzt und ineinander integriert, es erfolgt ein Austausch zwischen einzelnen Schnittstellen. Ein bekanntes Testwerkzeug hierfür ist das Citrus Framework für nachrichtenbasierte Systeme.

In Stufe drei erfolgt dann der Test auf dem System. Das Gesamtsystem ist zusammengesetzt und ein Funktionstest erfolgt.

Angenommen das System nutzt eine Datenbank als Persistenzschicht und die Abfragen darauf erfolgen über eine Oberfläche, dann ist hier ein wichtiges Kriterium auch eine angemessene Antwortgeschwindigkeit. Die angefragten Daten sollten zügig zurückgeliefert werden, auch wenn eine vielzahl Anwender gleichzeitig auf den Prozess zugreifen. Es empfiehlt sich daher auch Last und Performance zu testen. Ein bekanntes Werkzeug hierfür ist beispielsweise Gathling.

An der Spitze der Pyramide stehen die Abnahmetests. In der Theorie testet hier der Kunde mit und prüft die Anwendung. In der Praxis wird dies häufig durch automatisierte Oberflächentests gelöst, da die Auftraggeber nicht die Zeit haben sämtliche Masken durchzuklicken. Eines der bekanntesten Werkzeuge für Oberflächentests ist zweifelsohne Selenium. Damit lassen sich Webanwendungen leicht automatisiert testen. Alternativen für Desktopanwendungen sind Silk4J oder Tosca.

Motivation für Testautomatisierung

Manuelle Tests sind sehr ermüdend und eintönig. Nach dem zehnten Testen des gleichen Ablaufes dürfte jedem schnell die Lust vergehen. Dies kann sich nicht nur auf die Motivation der Testperson auswirken, sondern auch auf die Ergebnisqualität. Die Aufmerksamkeit sinkt und der ein oder andere Defect könnte unentdeckt bleiben. Ganz davon abgesehen, dass qualifiziertes Personal sicher wichtigere Aufgaben hat, als die gleiche Maske immer und immer wieder zu klicken.

Es gibt aber noch den Vorteil der Zeitersparnis. Testautomatisierungsskripte führen die Tests deutlich schneller aus als jeder Mensch. Somit ist es möglich in kürzerer Zeit mehr Tests durchzuführen und somit eine höhere Testabdeckung zu erzielen. Hinzu kommt noch, dass beispielsweise Lasttests sehr schwierig manuell durchgeführt werden können. Mehrere tausend Anwender zu simulieren, ist eine kostspielige Aufgabe. Mit Automatisierungsskripten ist dieses jedoch um ein Vielfaches einfacher. Gerade nichtfunktionale Anforderungen wie z.B. Antwortzeiten bei einer Vielzahl gleichzeitiger Nutzer zu testen, geht oftmals nur mit Testautomatisierung.

Automatisierbare Aktivitäten im Testverfahren

Grundsätzlich lässt sich nahezu alles automatisiert testen, die Frage ist eher nach der Sinnhaftigkeit:

Ist es sinnvoll einen Testfall zu automatisieren, der nur ein oder zweimal ausgeführt wird?
Wenn die Komplexität geringfügig ist, kann sich dies durchaus lohnen. Der Aufwand steht dem Nutzen gegenüber und daraus ergibt sich auch das Spektrum der Automatisierung.

Wichtige Programmpfade, wie bspw. der Login Prozess in die Anwendung, die immerzu getestet werden müssen sind hervorragende Kandidaten, um eine Testautomatisierung zu beginnen. Es empfiehlt sich hier mit Tests zu starten, die nicht zu trivial sind, aber auch den laufenden Betrieb nicht beeinflussen und das Projekt dann Schritt für Schritt zu erweitern.

Bei der Automatisierung werden die manuellen Tätigkeiten durch Skripte abgelöst, Dokumentationen automatisch erstellt und Protokolle generiert. Im Idealfall erfolgt dies auf Knopfdruck, so dass möglichst wenig manueller Aufwand nötig ist. Mehr dazu unter dem Punkt Integration in die Systemlandschaft. Doch wie kann die eigentliche Architektur einer solchen Automatisierungslösung oder kurz TAS (=Test Automation Solution) aussehen?

Universelle Architektur zur Testautomatisierung

Die Architektur einer Testautomatisierungslösung ist vielseitig und kann je nach Anwendungsfall leicht variieren. Dennoch haben sie im Kern alle Überschneidungen. In irgendeiner Form kommen immer Schnittstellen vor, sei es an externe Datenspeicher oder eine einfache GUI die über http testautomatisiert wird. Neben den Schnittstellen besteht eine Form von Ausführungsschicht in der sowohl Programmcode als auch die Generierung von Logs und Protokollen erfolgt.

Darüber ist eine Art Definitionsschicht, die Testfälle und Vorbedingungen spezifiziert, beispielsweise das Öffnen des Browsers. Ein einfaches Beispiel für diese Schicht wäre die given-when-then Testfallspezifikation von Cucumber:

Hier sollten auch benötigte externe Bibliotheken eingebunden und verwaltet werden. Als letzte Schicht kann es bei modellgetriebenem Testen noch eine Generierungsschicht geben, in der das benötigte Model spezifiziert ist.

Nicht jede Schicht ist für jede Testart notwendig. So können Unittests beispielsweise sehr gut ohne Schnittstellen auskommen.

Testfallerstellung

Die Testfallerstellung erfordert eine gute Kommunikation mit dem Fachbereich. Für gewöhnlich sitzt dort das Detailwissen über das zu testenden System. Die Fachlichkeit liefert eine Form von Anleitung, welche Schritte zum Testen notwendig sind, sei es eine schriftliche Spezifikation, eine Klickanleitung oder sogar ein Demovideo.

Diese Schritte lassen sich dann im Testfall abbilden, hierbei kommen immer wieder Testdaten zum Einsatz. Die Einbindungsmöglichkeiten sind vielfältig:

Testdaten- und Testskripterstellung

Bei den Testskripten gilt es zu entscheiden, ob eine Generierung über sogenannte Record & Replay Tools erfolgt oder eine Auskodierung der Testfälle angebracht ist.

Record & Replay zeichnet einen Benutzervorgang auf und übersetzt diesen dann in Code. Das Verfahren ist sehr einfach und von jedem anwendbar, hat aber den Nachteil, dass der Code sehr unflexibel ist und bei Änderungen am Testsystem häufig neu generiert werden muss.

In Anbetracht dessen, dass mehrere Hundert Testfälle mit regelmäßigen Anpassungen zum Einsatz kommen, ist dies selten die optimale Lösung.

Bei der Auscodierung von Testscripten erfolgt eine Programmierung die vergleichsweise aufwändig ist, allerdings sind diese Skripte deutlich nachhaltiger und besser wartbar.

Testdurchführung und Testreporting

Sobald die ersten Testfälle bereit zur Anwendung sind, stellt sich die Frage nach dem Durchführungszyklus. Während Unittests in wenigen Millisekunden ausgeführt werden, können Oberflächentests schon mehrere Minuten benötigen. Bewegt sich die Testanzahl im hunderter oder sogar tausender- Bereich, kommt hier einiges an Ausführungszeit zusammen. Dies ist auch der Grund eine geeignete Strategie einzuführen. Laufen Oberflächentests beispielsweise nur, wenn auch Änderungen an der GUI eingecheckt werden? Laufen die Gesamttests über Nacht? Hier spielen zahlreiche Faktoren eine entscheidende Rolle und die richtige Strategie ist hier entscheidend.

Auch das Thema Dokumentation ist enorm wichtig. Für gewöhnlich wird ein Reporting nach jeder Testdurchführung erzeugt. In diesem Report sollte je nach Zielgruppe auch die geeigneten Informationen zu finden sein. Für Entwickler ist sicherlich der Stacktrace wichtig, für die Projektleitung eher wieviel Prozent der Tests fehlerhaft waren und wie sich diese Zahl im Vergleich zum letzten Report verändert hat. Auch kann ein Dashboard relevante Informationen liefern die jedes Teammitglied übersichtlich und jederzeit einsehen kann.

Testadministration und Testwartung

Sobald Testscripte erstellt wurden sollten diese auch regelmäßig gewartet werden. Testumgebungen und das „system under test“ (kurz SUT) ändern sich besonders während der Entwicklungsphase ständig. Immer wieder werden Teile ergänzt, verändert oder entfernt. Dieses Vorgehen sollte auch bei Testcode angewendet werden. Sobald ein Test nicht mehr benötigt wird, ist es ratsam diesen zu entfernen.

Gleiches gillt für regelmäßige Wartung. Programmcode musst stetig auf dem neusten Stand gehalten werden, sonst schleichen sich leicht Fehler ein und Testergebnisse sind nicht mehr verlässlich. False Negatives, also gemeldete Fehler die durch fehlerhaften Testcode entstehen, lassen das Vertrauen in die Testautomatisierung sinken. Ein enger Austausch mit dem Entwicklerteam ist hier von Vorteil. So kann dieses am besten beurteilen, welche Programmänderungen weitreichende Auswirkungen auf andere Teile haben können.

Integration der automatisierten Testverfahren in die Systemlandschaft

Bei einer großen Anzahl Testfälle wird es stetig umständlicher alle Tests nach Codeänderungen auszuführen. Wie der Programmcode, sollte auch der Testcode in die vorhandene Continuous Integration / Continous Deployment (CI/CD) Pipeline* integriert werden. (*Beim CI/CD geht es um die automatisierte, kontinuierliche Integration und Verteilung von neuem Programmcode in die vorgesehene Umgebung. Beides wird zusammengefasst im DevOps Umfeld verwendet.)

Somit lässt sich die festgelegte Teststrategie automatisch durchführen, ohne dass sich jedes Teammitglied bei einer neuen Codeanpassung (Commit) darüber Gedanken machen muss. Einmal im Build Server hinterlegt, startet bei jedem Code Checkin der zugehörige Automatisierte Test.

Dabei werden dann sämtliche Protokolle und Berichte generiert und für die unterschiedlichen Zielgruppen korrekt an den gewünschten Stellen abgelegt. Um über den Entwicklungstand aufzuklären erfolgen ggf. weitere Mitteilungen z.B. via E-Mail an einen bestimmten Personenkreis.

Beispiel für eine Ci/CD Pipeline mit automatisierten Tests
Beispiel für eine Ci/CD Pipeline mit automatisierten Tests

Vor- und Nachteile der Testautomatisierung für Softwareentwickler und Unternehmen

Einige Vorteile wurden bereits im Laufe des Artikels angesprochen. Neben der Zeiteinsparung und einem höheren Testumsatz kommen aber noch einige weitere hinzu. So wird die Mitarbeitermotivation hochgehalten, da diese nicht immer dieselben Abläufe testen müssen. Sie können sich wichtigeren und sinnvolleren Aufgaben zuwenden. Somit lässt sich mit einer etablierten Testautomatisierung auch Kosten einsparen. Auch lassen sich durch eine Automatisierung Testfälle umsetzen die manuell gar nicht möglich oder nur mit sehr hohem Aufwand möglich waren, beispielsweise Last- und Performancetests.

Allerdings gibt es auch bei der Testautomatisierung selbstverständlich Nachteile. Besonders die Initialkosten sollten hier nicht außer Acht gelassen werden. Eine Umsetzung benötigt in den meisten Fällen Programmiererfahrung und auch eine regelmäßige Wartung. Es kann mehrere Testzyklen dauern, bis sich die Automatisierung finanziell gelohnt hat.

Durch die Programmierung, eingesetzten Technologien und Werkzeuge steigt die Komplexität. Personal mit Erfahrung in diesen Bereichen ist notwendig. Besondere Sorgfalt ist beim Entwickeln des Testcodes nötig, da sich auch hier Fehler einschleichen können.

Kritik an der Testautomatisierung und ihre Lösungsansätze

Die Lösungsansätze sind vielfältig. Von modellgetrieben, die dann Code generieren bis hin zu Aufzeichnungswerkzeuge die danach ebenfalls Testcode erzeugen. Das Ziel ist immer, es möglichst einfach für den Endanwender zu machen. In meinen Augen ist dies aber nur bedingt möglich, da immer eine gewisse Flexibilität und Erfahrung benötigt wird.

Ein Beispiel:

Mit einem Aufzeichnungswerkzeug werden immer die gleichen Parameter für Tests verwendet. Was passiert aber wenn dynamische Werte, wie z.B. die Uhrzeit oder das Datum notwendig werden? Dieser triviale Fall ist meistens noch durch Bausteine abgedeckt. Aber was passiert, wenn nach einem Eintrag in einer Tabelle gesucht werden muss und besagter Eintrag befindet sich immer an einer anderen Stelle in der Liste?

Sobald dieses Suchergebnis angeklickt werden muss, sind viele der Werkzeuge entweder am Ende oder es wird derart komplex das eine Programmierung notwendig wird. Weiterhin kommt hier der Kostenaspekt hinzu. Kommerzielle Werkzeuge, die Modellgenerierung oder Rekorder bieten, sind oft sehr teuer. Die Entwicklungsumgebungen, die nur Programmierung bieten, sind hier deutlich erschwinglicher und um einiges flexibler.

Ein Script zu schreiben, das einen bestimmten Eintrag auf einer Maske sucht, ist in meinen Augen deutlich einfacher als dies über Record and Replay zu realisieren. Manche Testfälle sind auch einfach zu komplex oder finden zu geringe Anwendung das sich der Aufwand rechtfertigt diese zu automatisieren. In jedem Fall wird das notwendige Know-how benötigt. Auch eignet sich nicht jeder Test für eine Automatisierung.

Neue Rolle in der Testautomatisierung: Der Testautomation Engineer

Seit geraumer Zeit gibt es in den Testteams die Rolle des Testautomation Engineers. Während zuvor ein Tester noch alle Aufgaben gleichermaßen übernommen hat, geht es aktuell eher in eine Aufteilung zwischen Testanalyst und Testautomatisierer. Während Analysten die Testvorbereitung und Testfallerstellung im Fokus haben, geht es bei den Automatisierern um die direkte Umsetzung als Testskripte. Auch das ISTQB hat dies längst erkannt, gibt es seit 2016 sogar eine eigene Zertifizierung hierfür: den Testautomation Engineer

Fazit: Testautomatisierung mit enorm viel Potential bei sinnvoller Anwendung

Testautomatisierung ist ein sehr großes Gebiet, dieser Artikel soll einen kleinen Einblick über diese Thema bieten. Zahlreiche Aspekte wurden hier angesprochen, dennoch gibt es weit mehr. Die Werkzeuge sind umfangreich und die Auswahl für die unterschiedlichen Bereiche enorm. Allein über die unterschiedlichen Testarten ließe sich ein eigener Artikel verfassen.

Wird eine Testautomatisierung richtig umgesetzt, lässt sich damit enorm viel Zeit einsparen, Fehler minimieren und frühzeitig aufdecken.

In größeren Softwareprojekten ist dies daher unumgänglich. Dennoch sollten nicht pauschal alle Testfälle automatisiert werden. Auch hier gilt zuvor eine Überlegung anzustreben, ob ein Mehrwert für den jeweiligen Testfall geboten ist. Testfälle die nur einmalig verwendet werden oder zu komplex in der Umsetzung eignen sich ggf. nicht für eine Automatisierung. Auch sollten die Reports stetig ausgewertet werden, um Änderungen zu verfolgen und Metriken zu erstellen. Wie hoch ist die Fehlerquote, an welchen Stellen treten vermehrt Defects auf? Veränderungen können hier helfen neue Testbereiche aufzudecken.

Zusammengefasst lässt sich klar erkennen, welche Vorteile eine Automatisierung für Unternehmen und Softwareprojekte mit sich bringt, trotz eines hohen Initialaufwandes. Entscheidend für den Erfolg einer Testautomatisierung ist der Einsatz der richtigen Strategie. Die richtige Herangehensweise, Toolauswahl und eventuelle Schulung der Mitarbeitenden sind wichtige Bestandteile. Mit diesen Faktoren berücksichtigt, ist eine Testautomatisierungslösung ein wertvolles Werkzeug für ihr Unternehmen.

Share.

Pascal Moll ist freiberuflicher Berater, Java-Entwickler und agiler Tester. 2021 belegte er den 2. Platz beim Freelancer des Jahres Wettbewerb. Er ist ISTQB Advanced Zertifiziert und seine Schwerpunkte liegen im Testmanagement und Testautomatisierung. Sein Wissen teilt er regelmäßig in Podcasts, Artikeln, Blogposts und Webinaren. Neben Cucumber Schulungen gibt er auch regelmäßig Selenium Kurse.

Leave A Reply

IT Freelancer Magazin Newsletter

Verpasse keine IT Freelancer News mehr! Jetzt zum Newsletter anmelden.

IT Freelancer Magazin F-Icon