Monkey-Testing von Software

Lasst die Affen testen – Monkey-Testing in der UI-Testautomatisierung

Kann man Benutzeroberflächen (UI) ohne Testfälle automatisiert testen? Ganz klar, ja.

Mit Monkey-Testing können Benutzeroberflächen ab der ersten Version automatisiert getestet werden. Die Robustheit der Software wird von Anfang an deutlich gesteigert, ohne einen einzigen Testfall zu erstellen. Allerdings gibt es Grenzen. Wie das funktioniert und wo die Grenzen von Monkey-Testing liegen, klärt dieser Beitrag.

Der lange Weg zum automatisierten Benutzeroberflächentest (UI-Test)

In Software-Projekten stehen automatisierte UI-Tests oftmals (wenn überhaupt) erst spät zur Verfügung.

Die Gründe hierfür sind vielschichtig. Um ein UI-Testautomatisierungssystem programmieren zu können, sollten die Anforderungen an die Benutzeroberfläche bekannt sein, ein erstes Bedienkonzept inkl. Formularentwürfen vorliegen, die Rahmenbedingungen des Testumfanges festgelegt und ein grundlegendes Architekturverständnis des Testsystems vorhanden sein.

Selbst in agilen Projekten werden die hohen Initialaufwände zum Aufbau eines UI-Testautomatisierungssystems auf spätere Iterationen verschoben, obwohl die Anforderungen (z.B. User Storys) und Akzeptanz Kriterien frühzeitig vorliegen. Bis die UI-Testautomatisierung einsatzbereit ist, verzichtet das Projektteam wissentlich auf die Möglichkeit eines regelmäßigen Feedbacks über die erreichte Qualität. Stattdessen versucht man, das Fehlen automatisierter UI-Tests durch verstärkten Einsatz manueller Testverfahren (z.B. exploratives Testen) zu kompensieren.

Wo liegen die Stärken des Monkey-Testings?

Monkey-Testing benötigt nur wenige Informationen über die Benutzeroberfläche. Somit können die Monkeys ab der ersten testfähigen Version losgelassen werden. Das Monkey-Testing steigert von Beginn an die Software-Qualität, da die Robustheit der Benutzeroberfläche ohne manuellen Aufwand automatisiert getestet wird.

Mit Monkey-Testing schließt sich die Lücke zwischen der ersten testfähigen Version und der meist später verfügbaren UI-Testautomatisierung.

Auch nach Einführung einer UI-Testautomatisierung spielt Monkey-Testing seine Stärken aus. Oftmals ist die UI-Testautomatisierung lückenhaft, da Programmänderungen noch nachgezogen werden müssen oder zu testende Funktionalitäten noch nicht umgesetzt wurden.

Was ist Monkey-Testing?

Monkey-Testing ist ein zufallsbasiertes Testverfahren, das auf dem Infinite-Monkey-Theorem basiert. Dieses besagt, dass ein Affe, der lange genug auf einer Schreibmaschine rumtippt, irgendwann die vollständigen Werke von William Shakespeare erzeugt hat. Überträgt man dies sinngemäß auf den Softwaretest, müsste ein Affe, der lange genug mit einer Benutzeroberfläche interagiert, sämtliche Funktionen durchlaufen und alle vorhandenen Fehler aufdecken.

Soviel zur Theorie – in der Praxis hat diese Behauptung nicht allzu lange bestand. Weder gibt es Affen, die auf Testrechnern herumtippen, noch gibt es fehlerfreie Software. Selbst wenn man dieser Idealvorstellung sehr nahe kommen möchte, würde ein Affe bzw. ein Testsystem, das diesen simuliert, immer noch sehr, sehr viel Zeit brauchen.

Wann ist Monkey-Testing sinnvoll?

Der größte Vorteil von Monkey-Testing liegt in der frühen Verfügbarkeit und dem geringen Aufwand für das Setup der Testinfrastruktur. Ein moderat intelligentes Monkey-Testing-System lässt sich innerhalb weniger Stunden installieren und konfigurieren (zumindest mit unserem Monkey-Testing-Werkzeug). Monkey-Testing kann daher zum Einsatz kommen, sobald ein lauffähiger Stand der Benutzeroberfläche vorliegt. Dies ist in den meisten Projekten zu einem Zeitpunkt der Fall, wo automatisierte funktionale Tests noch in weiter Ferne liegen.

Anders als bei automatisierten funktionalen Tests, muss das Monkey-Testing-System nicht an jede noch so kleine Änderung der fachlichen Anforderungen angepasst werden. Auch wenn der Test-Monkey vergleichsweise wenige Fehler findet, sind diese zu einem sehr frühen Auslieferungszeitpunkt bekannt und können zeitnah korrigiert werden. Zudem ermöglicht das zeitnahe Feedback, potentielle technische Risiken und Probleme schneller zu erkennen und frühzeitig gegenzusteuern.

Auch das Regressionsrisiko lässt sich durch Monkey-Testing deutlich reduzieren. Die Wunschvorstellung, alle funktionalen Tests zu automatisieren, um jederzeit alle bereits implementierten Features automatisiert testen zu können, scheitert oft an fehlenden Ressourcen im Testteam oder einer zu geringen Priorisierung der UI-Testautomatisierung.

Im agilen Projektumfeld müssen Teams zudem mit häufigen Änderungen der fachlichen Anforderungen umgehen. Ohne eine UI-Testautomatisierung, die dem aktuellen Stand der Anforderungen entspricht, lassen sich Regressionstests kaum in ausreichender Regelmäßigkeit und Breite durchführen. Der Versuch, die Lücken in der UI-Testautomatisierung durch mehr manuelle Regressionstests zu kompensieren, führt schnell dazu, dass die UI-Testautomatisierung noch mehr den Anschluss verliert. In der Folge werden Regressionstests oft unvollständig oder zu selten ausgeführt. Dabei reicht ein einfacher-, aber regelmäßig stattfindender (Anschalt-)Test aus, der sämtliche Formulare einer Web-Applikation aufruft und speichert. Auf diese Weise können Flüchtigkeitsfehler, wie diese beispielsweise aus Sourcecode-Merge- oder fehlerhaften Anwendungskonfiguration resultieren, aufgedeckt werden.

Wo liegen die Grenzen von Monkey-Testing?

Monkey-Testing liefert keinerlei Aussage darüber, ob die Anforderungen einer Applikation inhaltlich korrekt umgesetzt wurden. Hierfür müssen weiterhin funktionale Tests erstellt und manuell oder maschinell durchlaufen werden. Jedoch kann Monkey-Testing einen wertvollen Beitrag dazu liefern, die Robustheit einer Applikation gegenüber Fehlbedienung zu prüfen. Die Anzahl der explizit zu prüfenden Negativtests lässt sich damit in vielen Fällen reduzieren.

Durch Monkey-Testing lassen sich die funktionalen Tests der fachlichen Anforderungen NICHT ersetzen, können diese jedoch ergänzen. Einige Beispiele wie Anschalttests oder Reduzierung der Negativtestfälle wurden in diesem Artikel bereits genannt. Weitere Einsatzschwerpunkte sind Crashtest- oder Lasttest-Szenarien.

Hier einige Beispiele aus unserem Projektalltag:

Fehlende funktionale Tests im Scrum-Team
Nach dem zweiten Sprint ist das CI/CD System soweit etabliert, dass automatisierte Builds ausgeliefert werden können. Es fehlen jedoch noch funktionale Tests, um deren Qualität zu verifizieren.

Technische Migration auf ein anderes Datenbanksystem
Eine Web-Applikation wurde auf ein anderes Datenbanksystem migriert und auf der Testumgebung installiert. Die automatisierten Tests wurden mangels Zeit noch nicht auf das neue Datenbanksystem angepasst. Es ist unklar, ob das Deployment erfolgreich war und die Testumgebung für manuelle Tests freigegeben werden kann.

Fehlerhafter Sourcecode-Merge
Ein Feature-Branch wurde in den falschen Versionsstand des Trunks integriert. Der dafür verantwortliche Entwickler hat seinen Fehler mithilfe der automatisierten Unit-Tests rechtzeitig bemerkt und korrigiert. Dennoch ist unklar, ob alle Konfigurationsdateien in der richtigen Version eingecheckt wurden.

Integration neuer Features
Ein umfangreiches Feature wurde integriert, für das es noch keine automatisierten Tests gibt. Um das Testteam zu entlasten, soll der Release-Kandidat nur dann für einen manuellen Integrationstest freigegeben werden, wenn er ausreichend stabil ist.

Optimierung der funktionalen Testautomatisierung
Ein Release soll für den Abnahmetest auf der Umgebung des Kunden installiert werden. Aus Zeitgründen wurden nur Positivtestfälle automatisiert und der letzte manuelle Regressionstest liegt einige Wochen zurück. Da in der jüngeren Vergangenheit zufällig mehrere schwere Fehler entdeckt wurden, bestehen Zweifel an der Robustheit des Releases.

Für welchen Softwaretyp entsteht der größte Nutzen durch Monkey-Testing?

Den größten Nutzen erzielt Monkey-Testing, wenn Benutzeroberflächen ein standardisiertes Verhalten besitzen und einfach strukturiert sind.

Der Benutzer kann in einem Bereich der Benutzeroberfläche viele Aktionen ausführen, muss aber keine komplexen Navigationssequenzen durchlaufen, um andere Bereiche der Benutzeroberfläche zu erreichen. Hierzu gehört schwerpunktmäßig Software zur schematisierten Datenpflege (Objekte suchen, anlegen, bearbeiten, löschen).

Für komplexe Benutzeroberflächen mit vielen unterschiedlichen Navigationssequenzen, die je nach Datenkonstellation unterschiedliche Abzweigbedingungen ermöglichen, reduziert sich deutlich die Wahrscheinlichkeit, dass ein Test-Monkey die verschiedenen Abzweigbedingungen in endlicher Zeit durchlaufen kann.

Resümee

Wir nutzen in unseren Web-Projekten das Monkey-Testing, um Anschalttests mit den auslieferbaren neuen Software-Versionen durchzuführen. Verlaufen diese unauffällig, werden im Anschluss die teils sehr aufwendigen funktionalen Tests durchlaufen.

Bisher konnten wir nach Einführung der Test-Monkeys die Robustheit und somit die Qualität der ausgelieferten Software-Versionen – teils deutlich – steigern. Dabei geht die Qualitätssteigerung ohne manuellem Testaufwand einher.

Für uns hat sich Monkey-Testing als weiterer, fester Baustein der Testautomatisierung etabliert. Den geringen Einführungs- und Nutzungskosten steht ein schnelles und aussagekräftiges Feedback zur Qualität jeder neuen Software-Version gegenüber.