# Monkey Testing

Monkey-Testing (eng. Affentesten) ist eine Technik des Softwaretestens, bei der simuliert wird, ein Affe würde die Anwendung nutzen, d. h. es werden zufällige Eingaben auf der Benutzeroberfläche erzeugt und dabei überprüft, ob die Anwendung oder das System abstürzt. Der Affentest ist also die Extremform des Negativtests.

## Überblick

Während die Quelle des Namens „Monkey“ (eng. Affe) unsicher ist, wird von einigen angenommen, dass der Name mit dem Infinite-Monkey-Theorem zu tun hat, welches besagt, dass ein Affe, wenn er lange genug auf einer Schreibmaschine tippt, irgendwann die kompletten Werke von William Shakespeare erzeuge. Andere nehmen an, dass der Name von der klassischen Mac-OS-Anwendung „The Monkey“ abgeleitet wurde, die von Steve Capps vor 1983 entwickelt wurde, um zufällige Ereignisse in Mac-Programmen zu füttern, und um Programmfehler in MacPaint zu finden.

## Arten von Monkey Testing

Monkey-Testing kann in „dummes“ und „intelligentes“ Monkey-Testing (eng. dumb bzw. smart monkey testing) unterschieden werden.

### Dummes Monkey-Testing

Dummes Monkey-Testing hat folgende Eigenschaften:
* Kein Wissen über die Anwendung oder das System
* Kein Wissen darüber, ob das Eingabeverhalten gültig oder ungültig ist
* Kein Wissen über das Verhalten der Anwendung oder des Systems oder das typische Anwenderverhalten
* Kann weniger Fehler finden als intelligentes Monkey-Testing, findet aber u. U. wichtige Fehler, die von intelligentem Monkey-Testing schwerer gefunden werden.

### Intelligentes Monkey-Testing

Intelligentes Monkey-Testing wird normalerweise über folgende Eigenschaften unterschieden:
* Rudimentäres Wissen über die Anwendung oder das System
* Kennt den gegenwärtigen Zustand innerhalb der Anwendung, vergangene Zustände und mögliche zukünftige Zustände
* Kennt seine Fähigkeiten und die der Anwendung oder des Systems
* Versucht gezielt, die Anwendung oder das System zum Absturz zu bringen
* Berichtet über gefundene Fehler.
Manchmal wird intelligentes Monkey-Testing auch als brillantes Monkey-Testing (eng. brilliant monkey testing) bezeichnet, wenn es versucht, sich dem typischen Nutzerverhalten anzunähern und Aussagen über die Wahrscheinlichkeit des Auftretens der gefundenen Fehler machen kann.

## Vor- und Nachteile

Vorteile
Monkey-Testing ist ein effizienter Weg, um einige Out-of-the-Box-Fehler zu identifizieren. Da die getesteten Szenarien meist ad hoc sind, kann die Affenprüfung auch ein guter Weg sein, um Last- und Stresstests durchzuführen. Die intrinsische Zufälligkeit von Monkey-Testing macht es auch zu einer guten Methode, um kritische Fehler zu finden, die das gesamte System zerstören können. Das Aufsetzen von Monkey-Testing ist einfach, also gut geeignet für jede Art von Anwendung. Wenn intelligentes Monkey-Testing richtig konfiguriert ist und über ein ausreichend gutes Zustandsmodell verfügt, kann es gut verschiedene Arten von Fehlern finden.
Nachteile
Die Zufälligkeit von Monkey-Testing macht es oft schwierig oder unmöglich, die Fehler zu reproduzieren und damit auch anspruchsvoll und zeitaufwendig, sie zu analysieren. Bei bestimmten Systemen muss Monkey-Testing lange Zeit laufen, bevor es einen Fehler findet.

## Ähnliche Techniken und Unterscheidungen

Während Monkey-Testing gelegentlich als eine Unterart von Fuzz Testing angesehen wird und die beiden Begriffe in der Regel zusammen verwendet werden, sind andere der Meinung, sie unterscheiden sich darin, dass Monkey-Testing sich mehr über zufällige Aktionen definiert, Fuzz-Testing hingegen mehr über zufällige, aber strukturierte Daten (bspw. XML). Monkey-Testing unterscheidet sich auch von Ad-hoc-Tests, da Ad-hoc-Tests ohne Planung und Dokumentation durchgeführt werden, und es das Ziel einer Ad-hoc-Prüfung ist, das System zufällig in Unterabschnitte aufzuteilen und ihre Funktionalität zu überprüfen. Monkey-Testing hingegen prüft nicht die fachliche Funktionalität, sondern nur auf Robustheit.

## Tool-Unterstützung

* Für Web-Anwendungen ist eine JavaScript-Bibliothek namens gremlins.js verfügbar.
* Für Mobile-Anwendungen unter Android ist Monkey Testing als UI/Application Exerciser Monkey Teil der Standardtestwerkzeuge von Android Studio.
* Für Java-Swing-Anwendungen gibt es ein kommerzielles Werkzeug namens ReTest.