Monkeyrunner

Das alte monkeyrunner-Tool bietet eine API zum Schreiben von Programmen, die ein Android-Gerät oder Emulator ohne Android-Code verwenden.

Das monkeyrunner-Tool wurde hauptsächlich zum Testen von Apps und Geräten entwickelt auf Funktions-/Framework-Ebene und zum Ausführen von Unit-Testsuites. Sie können jedoch sie auch für andere Zwecke nutzen. Mit monkeyrunner können Sie ein Python-Programm schreiben die eine Android-App oder ein Testpaket installiert, sie ausführt, Tastenanschläge sendet erstellt Screenshots der Benutzeroberfläche und speichert Screenshots auf der Workstation.

<ph type="x-smartling-placeholder"></ph> Achtung: Die monkeyrunner API wird nicht gewartet. Wir empfehlen die Verwendung des App Crawler-Tool oder UI Automator (UI-Automator) testen.

Das monkeyrunner-Tool hat nichts mit dem UI/Application Exerciser Monkey, auch monkey-Tool genannt. Das monkey-Tool wird in einer adb-Shell direkt auf der Gerät oder Emulator und generiert pseudo-zufällige Streams von Nutzer- und Systemereignissen. Im Vergleich dazu steuert das monkeyrunner-Tool Geräte und Emulatoren von einer Workstation aus, indem es bestimmte Befehle und Ereignisse aus einer API abrufen können.

Das monkeyrunner-Tool bietet die folgenden Funktionen für Android-Tests:

  • Steuerung mehrerer Geräte: Die monkeyrunner API kann ein oder mehrere auf mehreren Geräten oder Emulatoren testen. Sie können alle Geräte verbinden, alle Emulatoren (oder beide) gleichzeitig starten, verbinden Sie sie nacheinander und führen Sie dann einen oder mehrere Tests aus. Sie können auch einen Emulator starten programmgesteuert, führen Sie einen oder mehrere Tests aus und fahren Sie dann den Emulator herunter.
  • Funktionstests: monkeyrunner kann einen automatisierten Start-to-Finish ausführen. einer Android-App getestet. Eingabewerte werden mit Tastenanschlägen oder Touch-Events eingegeben und die Ergebnisse als Screenshots.
  • Regressionstests: monkeyrunner kann die App-Stabilität testen, indem ein App erstellt und die Ausgabe-Screenshots mit einer Reihe bekannter Screenshots verglichen. richtig.
  • Erweiterbare Automatisierung: Da es sich bei monkeyrunner um ein API-Toolkit handelt, können Sie ein System aus Python-basierten Modulen und Programmen zur Steuerung von Android entwickeln Geräte. Neben der monkeyrunner API selbst können Sie auch die Standard- Python os und subprocess Module zum Aufrufen von Android-Tools wie Android Debug Bridge

    Sie können der monkeyrunner API auch Ihre eigenen Klassen hinzufügen. Dies ist genauer beschrieben in der Abschnitt monkeyrunner mit Plug-ins erweitern:

Das monkeyrunner-Tool verwendet Jython, eine Implementierung von Python, die die Programmiersprache Java verwendet. Mit Jython Die monkeyrunner API ermöglicht eine einfache Interaktion mit dem Android-Framework. Mit Jython können Sie kann Python-Syntax verwenden, um auf die Konstanten, Klassen und Methoden des APIs zuzugreifen.

Ein einfaches Monkeyrunner-Programm

Hier ist ein einfaches monkeyrunner-Programm, das eine Verbindung zu einem Gerät herstellt und ein MonkeyDevice -Objekt enthält. Das Programm installiert mithilfe des MonkeyDevice-Objekts eine Android-App. -Paket, führt eine seiner Aktivitäten aus und sendet Schlüsselereignisse an die Aktivität. Das Programm macht dann einen Screenshot des Ergebnisses, MonkeyImage-Objekt. Aus diesem Objekt schreibt das Programm eine PNG-Datei mit dem Screenshot.

# Imports the monkeyrunner modules used by this program.
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object.
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# whether the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# Sets a variable with the package's internal name.
package = 'com.example.android.myapplication'

# Sets a variable with the name of an Activity in the package.
activity = 'com.example.android.myapplication.MainActivity'

# Sets the name of the component to start.
runComponent = package + '/' + activity

# Runs the component.
device.startActivity(component=runComponent)

# Presses the Menu button.
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot.
result = device.takeSnapshot()

# Writes the screenshot to a file.
result.writeToFile('myproject/shot1.png','png')

Die monkeyrunner API

Die monkeyrunner API besteht aus drei Modulen im com.android.monkeyrunner-Paket:

  • MonkeyRunner: Eine Klasse von Dienstprogrammmethoden für monkeyrunner-Programme. Diese Klasse bietet ein Methode zum Verbinden von monkeyrunner mit einem Gerät oder Emulator. Außerdem bietet es Methoden zum Erstellen von Benutzeroberflächen für ein monkeyrunner-Programm und zum Anzeigen der integrierte Hilfe.
  • MonkeyDevice: Steht für ein Gerät oder einen Emulator. Diese Klasse bietet Methoden zum Installieren und wie Sie Pakete deinstallieren, eine Aktivität starten und Tastatur- oder Touch-Ereignisse an eine Sie verwenden diese Klasse auch, um Testpakete auszuführen.
  • MonkeyImage: Stellt ein Bildschirmaufnahmebild dar. Diese Klasse bietet Methoden zum Erfassen von Bildschirmen, Bitmapbilder in verschiedene Formate konvertieren, zwei MonkeyImage-Objekte vergleichen und Schreiben eines Bildes in eine Datei.

In einem Python-Programm greifen Sie als Python-Modul auf jede Klasse zu. Das monkeyrunner werden diese Module nicht automatisch importiert. Verwenden Sie zum Importieren eines Moduls die Methode Python-Anweisung from:

from com.android.monkeyrunner import <module>

Dabei ist <module> der Name des Kurses, den Sie importieren möchten. Sie können weitere als ein Modul in derselben from-Anweisung, indem die Modulnamen durch Kommas zu setzen.

monkeyrunner ausführen

Sie können monkeyrunner-Programme entweder aus einer Datei ausführen oder durch Eingabe von monkeyrunner Anweisungen in in einer interaktiven Sitzung. Beides tun Sie mit dem Befehl monkeyrunner, Sie finden sie im Unterverzeichnis tools/ Ihres SDK-Verzeichnisses. Wenn Sie einen Dateinamen als Argument angeben, führt der Befehl monkeyrunner führt den Dateiinhalt als Python-Programm aus Andernfalls wird eine interaktive Sitzung gestartet.

So sieht die Syntax des Befehls monkeyrunner aus:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

In Tabelle 1 werden die Flags und Argumente von monkeyrunner erläutert.

Tabelle 1 Flags und Argumente von monkeyrunner

Argumentation Beschreibung
-plugin <plugin_jar> (Optional) Gibt eine JAR-Datei mit einem Plug-in für monkeyrunner Weitere Informationen zu monkeyrunner-Plug-ins finden Sie in der Abschnitt monkeyrunner mit Plug-ins erweitern. Wenn Sie mehrere Dateien angeben möchten, fügen Sie das Argument mehrmals hinzu.
<program_filename> Wenn Sie dieses Argument angeben, führt der Befehl monkeyrunner den Inhalt aus der Datei als Python-Programm. Andernfalls startet der Befehl eine interaktive Sitzung nutzen.
<program_options> (Optional) Flags und Argumente für das Programm in <program_file>.

Hilfe zum integrierten Monkeyrunner

Zum Generieren einer API-Referenz für monkeyrunner führen Sie folgenden Befehl aus:

monkeyrunner help.py <format> <outfile>

Die Argumente sind:

  • <format> ist entweder text für die Nur-Text-Ausgabe oder html für die HTML-Ausgabe.
  • <outfile> ist ein pfadqualifizierter Name für die Ausgabedatei.

Monkeyrunner mit Plug-ins erweitern

Sie können die monkeyrunner API mit Klassen erweitern, die Sie in Java schreiben und in eine oder mehrere JAR-Dateien einzubauen. Mit dieser Funktion können Sie die monkeyrunner API mit Ihren eigenen Klassen oder zum Erweitern der vorhandenen Klassen verwenden. Ich kann diese Funktion auch zur Initialisierung der monkeyrunner-Umgebung verwenden.

Rufen Sie den Befehl monkeyrunner auf, um für monkeyrunner ein Plug-in bereitzustellen. mit dem Argument -plugin <plugin_jar>, das in Tabelle 1.

In Ihrem Plug-in-Code können Sie die monkeyrunner-Hauptklassen importieren und erweitern MonkeyDevice, MonkeyImage und MonkeyRunner in com.android.monkeyrunner (siehe Abschnitt zur monkeyrunner API).

Beachten Sie, dass Plug-ins keinen Zugriff auf das Android SDK ermöglichen. Sie können keine Pakete importieren wie com.android.app. Das liegt daran, dass monkeyrunner mit das Gerät oder den Emulator unterhalb der Ebene der Framework-APIs liegt.

Plug-in-Startklasse

In der JAR-Datei für ein Plug-in kann eine Klasse angegeben werden, die vor dem Skriptverarbeitung wird gestartet. Fügen Sie den Schlüssel hinzu, um diese Klasse anzugeben MonkeyRunnerStartupRunner zu den Manifests. Verwenden Sie als Wert den Namen der Klasse, die beim Start ausgeführt werden soll. Die folgenden zeigt dies in einem ant-Build-Skript:

<jar jarfile="myplugin" basedir="${build.dir}">
<manifest>
<attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
</manifest>
</jar>

Um Zugriff auf die Laufzeitumgebung des monkeyrunner-Tools zu erhalten, kann die Startklasse com.google.common.base.Predicate<PythonInterpreter>. Zum Beispiel -Klasse einige Variablen im Standard-Namespace ein:

Kotlin

package com.android.example

import com.google.common.base.Predicate
import org.python.util.PythonInterpreter

class Main: Predicate<PythonInterpreter> {

    override fun apply(anInterpreter: PythonInterpreter): Boolean {
        /*
         * Examples of creating and initializing variables in the monkeyrunner environment's
         * namespace. During execution, the monkeyrunner program can refer to the variables
         * "newtest" and "use_emulator"
         *
         */
        anInterpreter.set("newtest", "enabled")
        anInterpreter.set("use_emulator", 1)
        return true
    }
}

Java

package com.android.example;

import com.google.common.base.Predicate;
import org.python.util.PythonInterpreter;

public class Main implements Predicate<PythonInterpreter> {
    @Override
    public boolean apply(PythonInterpreter anInterpreter) {

        /*
        * Examples of creating and initializing variables in the monkeyrunner environment's
        * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
        * and "use_emulator"
        *
        */
        anInterpreter.set("newtest", "enabled");
        anInterpreter.set("use_emulator", 1);

        return true;
    }
}