Was ist ein Monkey-Testing-System (MTS)?

Ein Monkey-Testing-System ist eine Software, die das Infinite-Monkey-Theroem als automatisiertes Testsystem umsetzt. Hierzu benötigt das Monkey-Testing-Systems (MTS) lediglich die Angabe, welche Software zu testen ist.

Welche Testalgorithmen kommen zum Einsatz?

Der Testablauf ist abhängig von den programmierten Algorithmen des Monkey-Testing-Systems. Diese reichen von einfachen sequentiellen Abläufen, über die Nutzung von Heuristiken, bis hin zum Einsatz künstlicher Intelligenz (KI).

Der Testdurchlauf ersetzt fehlendes Fachwissen durch Beharrlichkeit

Da dem Monkey-Testing-System keine fachlichen Anforderungen zum Testobjekt bekannt sind, kann es mit minimalem Aufwand auf die zu testende Software angepasst werden. Den Mangel an fachlicher Information gleicht das Monkey-Testing-System durch seine Beharrlichkeit aus.

Anders als ein menschlicher Tester oder ein Automatisierungsskript, kann es rund um die Uhr testen und dabei selbstständig eine Vielzahl an Interaktionsfolgen und Varianten der Eingabedaten ausprobieren. Führt eine Interaktionsfolge in eine Sackgasse, startet das Monkey-Testing-System einen neuen Testlauf.

Ein einfaches Monkey-Testing-System ist schnell entwickelt!

Ein einfaches Monkey-Testing-System zur Prüfung der, lässt sich mit geringen Mitteln umsetzen. Nach dem Zufallsprinzip wählt das Monkey-Testing-System Elemente der Benutzeroberfläche aus und führt darauf beliebige Aktionen wie Klicks oder Tastatureingaben aus. Die Art der ausgeführten Aktionen, sowie das beobachtbare Systemverhalten werden für jeden Schritt dokumentiert. Wird im Anschluss bei der Analyse eines Monkey-Testlaufs ein auffälliges Verhalten festgestellt, lässt sich anhand der dokumentierten Schritte das auffällige Verhalten reproduzieren.

Das Feature „Heuristiken“ reduziert signifikant das manuelle Testen!

Durch die Programmierung von Heuristiken kann das Monkey-Testing-System zielgerichtet arbeiten. So können beispielsweise Variationen von Eingabedaten bevorzugt verwendet werden, die bereits zu einem auffälligen Systemverhalten geführt haben oder die erfahrungsgemäß oft zu Fehlern führen (Grenzwerte, Eingaben mit Sonderzeichen oder leere Zeichenketten, etc).

Das Feature „KI“ steigert die Effizienz im Testdurchlauf!

Ein intelligentes Monkey-Testing-System merkt sich abgearbeitete Interaktionsfolgen, um diese nicht erneut ausführen. Durch die Verknüpfung mit Metriken (z.B. Code-Coverage) kann das Monkey-Testing System Interaktionsfolgen hinsichtlich ihrer Eignung zur Erreichung eines Optimierungsziels bewerten und entsprechend weiterverfolgen oder verwerfen. Hochentwickelte Monkey-Testing-Systeme nutzen darüber hinaus Verfahren aus dem Bereich der KI – wie etwa genetische Algorithmen, womit sich die Effizienz und die Effektivität der Testdurchführung deutlich steigern lässt.

Das Feature „Testobjekt-spezifisches Wissen“ fokussiert den Testdurchlauf

In geringem Umfang muss auch ein Monkey-Testing-System mit anwendungsbezogenen Informationen konfiguriert werden. So muss das Monkey-Testing-System beispielsweise in der Lage sein, sich am Testobjekt anzumelden oder einen schweren Fehler (z.B. Absturz) selbstständig zu erkennen, um anschließend das Testobjekt neu starten zu können. Auch kann es in vielen Fällen notwendig sein, sogenannte Black- oder Whitelists zu definieren, die dem Monkey-Testing-System zeigen, welche Navigationspfade erlaubt (Whitelist) oder – verboten sind (Blacklist). Andernfalls würde ein Monkey-Testing-System, das eine Webapplikation testet nicht bemerken, wenn es diese über einen Link verlässt und auf externen Seiten weiter testet. Hmm – Im worst case, würde das Monkey-Testing-System alle Internetseiten dieser Welt testen….

Resümee

Wir haben in unseren Kundenprojekten mit der Programmierung projektspezifischer Monkey-Testing-Systeme Software sehr gute Erfahrungen gemacht. Besonders dann, wenn die Faktoren:

  1. große Software-Qualitätsmängeln, in Kombination mit
  2. Termindruck,
  3. Geringem Testbudget oder
  4. Personalmangel (da Testexperten am Markt nicht verfügbar sind)

zusammentreffen.

In unseren Kundenprojekten führt die Programmierung eines einfachen Monkey-Testing-Systems nach wenigen Wochen zu einer deutlichen Qualitätssteigerung der zu entwickelnden Software. Besonders imageschädigende Programmabstürze werden sehr schnell und früh erkannt. Der manuelle Testdurchlauf wird mit jedem Testzyklus nach manuellen, wiederkehrenden monotonen Ablaufmustern hin überprüft. Mittels einer einfachen Kosten-/Nutzen-Rechnung, werden diese als neue Feature im Monkey-Testing-System umgesetzt.

In unseren Kundenprojekten führt der Einsatz eines testobjektspezifischen Monkey-Testing-System zu einer deutlichen Reduktion der Testszenarien bei gleichzeitig steigender Qualität des zu entwicklenden Software-Produktes.

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.