×
Piktogramme stellen Ablauf von Online Shopping dar

Neue Testautomatisierungsansätze mit Themen-getriebenem Testen



Testautomatisierung in der Praxis

Testautomatisierung ist oft eines der Schlagwörter, das im Zusammenhang mit agiler Softwareentwicklung fällt. Kurze Entwicklungszyklen (insbesondere auch continous delivery) verlangen es, die Qualitätsansprüche der Software effizient und schnell zu testen, um so potentielle Fehler möglichst früh im Entwicklungsprozess zu erkennen und zu beheben. Eine vernünftige Testautomatisierung aufzubauen, in Betrieb zu halten und weiterzuentwickeln stellt einen beachtlichen Kostenfaktor dar.

Selbst wenn die Infrastrukturkosten außer Acht gelassen werden, erfordern qualitative Tests erfahrene EntwicklerInnen und ein gutes technisches Grundverständnis. Schlechte Tests sind beispielsweise wenig robust gegen Änderungen der Software und fordern in Zukunft erhöhten Wartungsaufwand. Mit der Entwicklung von den “Big Four” Machine Learning, Deep Learning, neuronalen Netzen und künstlicher Intelligenz erwarteten viele, den heiligen Gral der Testautomatisierung gefunden zu haben. Doch auch wenn diese Techniken mächtig sind und gewiss auch für Testautomatisierung verwendet werden können, ist ein enormer Aufwand erforderlich, um tatsächlichen Mehrwert mit ihnen zu erzielen. Angepasst auf das spezielle Anwendungsgebiet benötigen diese Big Four einen erheblichen Trainingsaufwand (Labeled Data - Lernphase mit vorbereiteten Eingabedaten beziehungsweise Erwartungswerten) und lösen selbst dann nur sehr spezielle Probleme in der Softwareentwicklung.

In diesem Blogeintrag wird nun eine Technik untersucht, mit der man maschinelles Lernen zumindest unterstützend bei der Testentwicklung einsetzen kann, ohne dabei aufwendige Trainingsphasen sowohl bei der Maschine als auch bei den MitarbeiterInnen vorauszusetzen. Zentral ist hier die Integration von natürlicher Sprache in die Testgenerierung und Testauswertung. Basierend auf wissenschaftlichen Publikationen im Bereich Testautomatisierung [1-4] werden Testanweisungen nicht mehr syntaktisch interpretiert, sondern semantisch aufbereitet.

Screenshot einer Bestellbestätigung auf einer E-Commerce Website
Abb. 0: Bestellbestätigungsbildschirm einer E-Commerce Webseite.

Die obere Abbildung zeigt eine typische Verkaufswebseite aus dem Onlinehandel. Beim Einkauf muss in jedem Fall eine Versandadresse und eine Zahlungsmethode eingegeben werden. Diese Information kann geprüft und geändert werden. Schon jetzt ist intuitiv klar: für die Kundschaft muss dieser Prozess möglichst einfach sein und sich nicht besonders von anderen Online-Shops unterscheiden. Betrachtet man diesen Sachverhalt, stellt sich die Frage, weshalb die Entwicklung eines automatisierten Tests, der rein diese Funktionalität prüft, so aufwendig ist.

Screenshot eines Selenium-Tests zur Eingabe einer neuen Adresse
Abb. 1: Auszug aus dem Selenium-Test zur Eingabe einer neuen Adresse.

Im Grunde genommen bestehen funktionale Tests aus Testdaten (engl. Input Data) wie Benutzername oder Passwort und Zielelementen (engl. Targets) wie Eingabefeldern oder Buttons. Ein robuster Test-Code, der hier beispielsweise die Adressänderung simuliert, kann unter Umständen bereits recht komplex werden (s. Abbildung 1). In diesem Fall wird Selenium [5], ein typisches Testautomatisierungswerkzeug, zur Kontrolle eines Browsers verwendet. Um mit bestimmten Elementen auf der Webseite zu interagieren, wird das Target über den sogenannten XPath bestimmt, der von der HTML Struktur abhängt. Da sich diese bei der Weiterentwicklung der Seite ändert, vergibt man bei der Entwicklung der Webseite feste und eindeutige Identitäten, die id, welche dann von TestentwicklerInnen verwendet werden können. Ändert sich jedoch die Struktur der graphischen Oberfläche oder wird die Software für verschiedene Endgeräte-Plattformen (beispielsweise mobile Endgeräte) entwickelt , müssen die Tests unter Umständen komplett neu entwickelt werden. Dieses Beispiel zeigt bereits die Grundzüge der komplexen Anforderungen an den Testautomatisierungsprozess: eine frühzeitige Ausrichtung der Produktentwicklung auf die Testanforderung und die Entwicklung von robusten und erweiterbaren Tests.

Testdaten-Spezifikation für den Use-Case Adresse ändern
Abb. 2: Testdaten-Spezifikation für den Use-Case "Adresse Ändern".

Im Gegensatz dazu sieht die menschliche Kundschaft neben der aktuellen Versandadresse den Knopf Ändern, erkennt durch dessen Positionierung den Kontext und öffnet das Menü zur Adressänderung. Die Eingabe der neuen Adresse folgt demselben Schema. Die Beschreibung neben dem Eingabefeld bestimmt das Ziel der Eingabe. Kleinere Änderungen am Text wie dem Ändern des Labels “Versandadresse” zu “Lieferadresse” stellt für die Kundschaft dabei kein Problem dar, da diese die semantische Bedeutung der Beschreibung interpretiert. Im Prinzip könnte sie mit einem vereinfachten Testskript (s. Abbildung 2) die Anwendung testen, ohne jedwedes technisches Verständnis darüber zu besitzen, wie Anweisungen auf die Anwendung übertragen werden. Ebenso kann das Skript erweitert werden, um neuen Testanforderungen zu genügen.

Um diese semantische Interpretation in der Testentwicklung nutzen zu können, müssen einige komplexe Technologien miteinander kombiniert werden. Grundlegend sind zwei Bausteine, die vereinfachte Testskripte in konkrete Testausführungen verwandeln:

  • (I) Visual Clustering: Analysiert die graphische Oberfläche, um interaktive Elemente zusammen mit ihrer Beschreibung zu extrahieren.
  • (II) Semantic Interpretation Unit: Gleicht die graphischen Elemente mit den Testdaten ab, interpretiert die Zielbeschreibung semantisch, um möglichst robuste Tests zu erzeugen.

Visual Clustering: Extraktion von potentiellen Zielelementen

Im ersten Schritt wird die gegebene Testseite analysiert, um potentielle Zielelemente zu identifizieren. Die graphische Oberfläche abstrahiert im Allgemeinen die technische Komplexität für die Kundschaft und dient dazu, leicht verständliche Prozessabläufe zu ermöglichen. Dabei kann man beim UI-Design zwischen zwei Typen von Elementen unterscheiden, die für die Kundschaft von Bedeutung sind. Interaktive Elemente wie Input-Felder, Drop-Down-Menüs, Links oder Buttons werden zur Prozesssteuerung benutzt und entsprechen den bereits erwähnten Targets. Beschreibende Elemente dienen der reinen Informationsdarstellung. Während der initialen Analyse kann eine Menge von interaktiven Elementen extrahiert werden, allerdings ohne programmatisch ihre Funktionen zu kennen. An diesem Punkt setzen standardmäßig zufallsbasierte Testansätze, random testing, an. Die vorgegebenen Testdaten werden zufällig in die potentiellen Zielfelder eingegeben, um potentielle Verarbeitungsfehler aufzudecken. Für eine zuverlässige Testautomatisierung ist diese Testart jedoch ungeeignet, denn zufällige Eingaben resultieren im Allgemeinen auch in zufälligen Ergebnissen.

Screenshot multipler Eingabefelder in einem Adressänderungsdialog
Abb. 3: Adressänderungsdialog mit multiplen Eingabefeldern.

Wie im hier aufgeführten Beispiel (s. Abbildung 3) befinden sich Textbeschreibungen oft in direkter Nähe zum interaktiven Element, sind Teil eines Platzhaltertextes oder Beschriftungen des Elements (Buttons). Diese sind selbstverständlich für die Kundschaft gedacht, aber auch gleichzeitig hilfreich für die Testautomatisierung. Durch Visual Clustering werden die Elemente anhand ihrer Anordnung gruppiert beziehungsweise, im Fall von Links oder Buttons, zusammen mit ihrem Text extrahiert. Das Ergebnis ist eine Liste von Targets zusammen mit ihrer Beschreibung.

Semantic Interpretation Unit

Das Problem mit der einfachen Textbeschreibung liegt in ihrer Anfälligkeit gegenüber Änderungen begründet. Dies betrifft auch kleine Unterschiede wie die Groß- und Kleinschreibung oder das Austauschen von Begriffen (Benutzername zu Username, eMail, Login, o.ä.). Während sich die semantische Bedeutung für die Kundschaft nicht ändert, sind existierende Ansätze basierend auf Textvergleichen sofort unbrauchbar. Ebenso ist die Spezifikation von Tests aufwendig und nicht intuitiv, denn die Zielbeschreibungen müssen exakt der UI-Vorgabe entsprechen. Hier hilft ein auf DeepLearning basierter Ansatz: word vector models. Bei dieser Technik werden einzelne Worte mathematisch in einen Vektorraum projiziert. Die konkrete Position der Worte wird durch ein neuronales Netzwerkt erlernt. Diese sogenannte Trainingsphase wird nur einmal durchgeführt und muss im Allgemeinen nicht wiederholt oder für spezielle Anwendungen eingeübt werden. Dabei wird eine große Menge von Texten genutzt (z.B. alle deutschen Wikipedia-Artikel mit insgesamt mehreren Milliarden Worten), um zu lernen, welche Worte im gleichen Zusammenhang genutzt werden. Je häufiger dies auftritt, desto wahrscheinlicher ist es, dass die Worte einen semantischen Zusammenhang bilden. Als Ergebnis bildet der Vektorraum Worte mit der gleichen Bedeutung an nahe Punkte ab.

Grafische Darstellung im Vektorraum der Top 500 gerankten U.S.-Webseiten nach semantischen Zusammenhängen
Abb. 4: Word Vector Analysis der Top 500 gerankten U.S.-Webseiten gruppiert nach semantischen Zusammenhängen.

Diese Eigenschaft können wir nun zur Testautomatisierung nutzen. Wir interpretieren die Testanweisungen aus dem Beispiel in Abbildung 2 semantisch und identifizieren so die vom Testskript abgedeckten Targets. Aus allen in Schritt 1 identifizierten, interaktiven Elementen wird der nächste Testschritt auf das Element mit der höchsten semantischen Ähnlichkeit zur Textbeschreibung ausgeführt. Durch die Zusammenfassung von einzelnen Testschritten in Makros können die Testschritte ebenso einfach in einer Vielzahl von Anwendungsfällen getestet werden. Ein typisches Beispiel ist der Login-Prozess, der aus der Eingabe von Benutzername und Passwort besteht. Aber auch komplexe Programmabläufe können kreiert und wieder verwendet werden, wie beispielsweise der komplette Einkauf oder auch das Publizieren eines neuen Blogartikels.

Ergebnisse in der Praxis

Die Ergebnisse sind überraschend. Nicht nur lassen sich die Testskripte auf die gewünschte Zielseite übertragen, sie lassen sich auch ohne Weiteres auf die mobilen Anwendungen übertragen, sogar dann, wenn sich aufgrund der beschränkten Größe auf dem mobilen Endgerät die graphischen Oberflächen und Programmabläufe ändern. In ersten Anwendungen aus dem Bereich E-Commerce, MediaWikis, Booking-Webseiten, Nachrichtenseiten, Suchmaschinen und vielen weiteren konnten die Testskripte ohne weiteren manuellen Aufwand zu über 90% sowohl auf die mobile als auch die Desktop-Variante der Webseite angewendet werden. Selbst die Übertragung auf die entsprechenden Android-Apps ist möglich. In einer weiteren Bewertung wurden die gleichen Anwendungsfälle auf verschiedene Apps wie zum Beispiel Amazon und eBay angewendet. Hier zeigt sich, dass durchaus ähnliche Design-Entscheidungen auf den verschiedenen Seiten angewendet werden - vermutlich, um einen gewissen Wiedererkennungswert für eine verbesserte Usability zu erreichen. Auch wenn sich die Position, das Styling und die beschreibenden Texte der einzelnen Targets unterscheiden, so gibt es nur wenige Unterschiede im eigentlichen Programmablauf und der semantischen Interpretation. Hier zeigt sich eine weitere Stärke von themen-getriebenem Testen: Etwa 70% des Programmablaufs sind identisch und können daher problemlos übertragen werden.

Mit diesen Ergebnissen können wir nun einen Blick auf den Anfang dieses Artikels werfen und noch einmal die Erwartung des heiligen Grals der Testautomatisierung überprüfen. Selbstverständlich ist themen-getriebenes Testen nicht die Lösung aller Probleme in der Testautomatisierung. Aktuell kann es jedoch bereits die Komplexität der Testentwicklung deutlich reduzieren. Statt komplizierte Testschritte und Abläufe in einer technischen Sprache zu definieren, erfolgt die Entwicklung in einer nahezu natürlichen Sprache. Auch sind die erzeugten Tests nicht plattform-spezifisch, sie lassen sich sowohl auf der mobilen und Desktop-Variante einer Anwendung als auch auf mobilen Endgeräten und nativen Apps ausführen. Die Übertragbarkeit auf andere Apps ist bisher eher von akademischem Interesse, legt aber den Grundstein für weitere Forschungen in diesem Bereich.

Referenzen

  • [1] Efficient GUI test generation by learning from tests of other apps A Rau, J Hotzkow, A Zeller, 2018 IEEE/ACM 40th International Conference on Software Engineering
  • [2] Transferring tests across web applications A Rau, J Hotzkow, A Zeller, International Conference on Web Engineering, 50-64
  • [3] Topic-driven testing A Rau, 2017 IEEE/ACM 39th International Conference on Software Engineering
  • [4] Automatic Test Transfer across Applications A Rau, M Reinert, A Zeller, 2016 Chair of Software Engineering, Saarland University
  • [5] https://www.selenium.dev/