Lo strumento legacy monkeyrunner fornisce un'API per scrivere programmi che controllano un
dispositivo o un emulatore Android dall'esterno del codice Android.
Lo strumento monkeyrunner è progettato principalmente per testare app e dispositivi
a livello funzionale/di framework e per eseguire suite di test delle unità, ma puoi utilizzarlo
per altri scopi. Con monkeyrunner, puoi scrivere un programma Python
che installa un'app per Android o un pacchetto di test, lo esegue, invia sequenze di tasti,
acquisisce screenshot della sua interfaccia utente e li memorizza sulla workstation.
Attenzione: l'API monkeyrunner non viene più gestita. Ti consigliamo di utilizzare il framework di test UI Automator.
Lo strumento monkeyrunner non è correlato a
UI/Application Exerciser Monkey,
noto anche come strumento monkey. Lo strumento monkey viene eseguito in una shell adb direttamente sul dispositivo o sull'emulatore e genera flussi pseudo-casuali di eventi utente e di sistema. Al contrario,
lo strumento monkeyrunner controlla i dispositivi e gli emulatori da una workstation inviando
comandi ed eventi specifici da un'API.
Lo strumento monkeyrunner offre le seguenti funzionalità per i test Android:
-
Controllo di più dispositivi: l'API
monkeyrunnerpuò applicare una o più suite di test su più dispositivi o emulatori. Puoi collegare fisicamente tutti i dispositivi o avviare tutti gli emulatori (o entrambi) contemporaneamente, connetterti a ciascuno a turno in modo programmatico e poi eseguire uno o più test. Puoi anche avviare un programma di configurazione dell'emulatore in modo programmatico, eseguire uno o più test e poi arrestare l'emulatore. -
Test funzionali:
monkeyrunnerpuò eseguire un test automatizzato dall'inizio alla fine di un'app per Android. Fornisci i valori di input con sequenze di tasti o eventi tocco e visualizza i risultati come screenshot. -
Test di regressione:
monkeyrunnerpuò testare la stabilità dell'app eseguendo un'app e confrontando gli screenshot dell'output con un insieme di screenshot noti per essere corretti. -
Automazione estensibile: poiché
monkeyrunnerè un toolkit API, puoi sviluppare un sistema di moduli e programmi basati su Python per controllare i dispositivi Android. Oltre a utilizzare l'APImonkeyrunner, puoi utilizzare i moduli standard Pythonosesubprocessper chiamare gli strumenti Android, come Android Debug Bridge.Puoi anche aggiungere i tuoi corsi all'API
monkeyrunner. Questo aspetto è descritto in modo più dettagliato nella sezione Estendere monkeyrunner con i plug-in.
Lo strumento monkeyrunner utilizza
Jython, un'implementazione di Python che utilizza il linguaggio di programmazione Java. Jython consente
all'API monkeyrunner di interagire facilmente con il framework Android. Con Jython, puoi
utilizzare la sintassi Python per accedere alle costanti, alle classi e ai metodi dell'API.
Un semplice programma monkeyrunner
Ecco un semplice programma monkeyrunner che si connette a un dispositivo, creando un
oggetto
MonkeyDevice. Utilizzando l'oggetto MonkeyDevice, il programma installa un pacchetto dell'applicazione Android, esegue una delle sue attività e invia eventi chiave all'attività.
Il programma acquisisce quindi uno screenshot del risultato, creando un
oggetto MonkeyImage.
Da questo oggetto, il programma scrive un file PNG contenente lo 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')
L'API monkeyrunner
L'API monkeyrunner è contenuta in tre moduli del pacchetto
com.android.monkeyrunner:
-
MonkeyRunner: Una classe di metodi di utilità per i programmimonkeyrunner. Questa classe fornisce un metodo per connetteremonkeyrunnera un dispositivo o a un emulatore. Fornisce inoltre metodi per creare interfacce utente per un programmamonkeyrunnere per visualizzare la guida integrata. -
MonkeyDevice: Rappresenta un dispositivo o un emulatore. Questa classe fornisce metodi per installare e disinstallare pacchetti, avviare un'attività e inviare eventi di tastiera o tocco a un'app. Utilizzi questa classe anche per eseguire pacchetti di test. -
MonkeyImage: Rappresenta un'immagine di acquisizione schermo. Questa classe fornisce metodi per acquisire schermate, convertire immagini bitmap in vari formati, confrontare due oggettiMonkeyImagee scrivere un'immagine in un file.
In un programma Python, accedi a ogni classe come modulo Python. Lo strumento monkeyrunner
non importa automaticamente questi moduli. Per importare un modulo, utilizza l'istruzione
Python from:
from com.android.monkeyrunner import <module>
dove <module> è il nome del corso che vuoi importare. Puoi importare più di un modulo nella stessa istruzione from separando i nomi dei moduli con virgole.
Esegui monkeyrunner
Puoi eseguire i programmi monkeyrunner da un file o inserendo
le istruzioni monkeyrunner in
una sessione interattiva. Per eseguire entrambe le operazioni, richiama il comando monkeyrunner,
che si trova nella sottodirectory tools/ della directory SDK.
Se fornisci un nome file come argomento, il comando monkeyrunner
esegue i contenuti del file come programma Python; in caso contrario, avvia una sessione interattiva.
Di seguito è riportata la sintassi del comando monkeyrunner:
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
La Tabella 1 spiega i flag e gli argomenti di monkeyrunner.
Tabella 1. Flag e argomenti di monkeyrunner
| Argomento | Descrizione |
|---|---|
-plugin <plugin_jar>
|
(Facoltativo) Specifica un file JAR contenente un plug-in per
monkeyrunner.
Per saperne di più sui plug-in monkeyrunner, consulta la sezione
Estendere monkeyrunner con i plug-in.
Per specificare più di un file, includi l'argomento più volte.
|
<program_filename>
|
Se fornisci questo argomento, il comando monkeyrunner esegue i contenuti
del file come programma Python. In caso contrario, il comando avvia una
sessione interattiva.
|
<program_options>
|
(Facoltativo) Flag e argomenti per il programma in <program_file> |
Guida integrata di monkeyrunner
Puoi generare un riferimento API per monkeyrunner eseguendo:
monkeyrunner help.py <format> <outfile>
Gli argomenti sono:
-
<format>ètextper l'output di testo normale ohtmlper l'output HTML. -
<outfile>è un nome qualificato dal percorso per il file di output.
Estendere monkeyrunner con i plug-in
Puoi estendere l'API monkeyrunner con classi scritte in Java
e compilate in uno o più file JAR. Puoi utilizzare questa funzionalità per estendere
l'API monkeyrunner con le tue classi o per estendere le classi esistenti. Puoi
utilizzare questa funzionalità anche per inizializzare l'ambiente monkeyrunner.
Per fornire un plug-in a monkeyrunner, richiama il comando monkeyrunner
con l'argomento -plugin <plugin_jar> descritto nella
tabella 1.
Nel codice del plug-in, puoi importare ed estendere le classi principali monkeyrunner
MonkeyDevice, MonkeyImage e MonkeyRunner in
com.android.monkeyrunner (consulta la sezione relativa all'API monkeyrunner).
Tieni presente che i plug-in non ti danno accesso all'SDK Android. Non puoi importare pacchetti
come com.android.app. Questo perché monkeyrunner interagisce con
il dispositivo o l'emulatore al di sotto del livello delle API framework.
The plugin startup class
Il file JAR di un plug-in può specificare una classe di cui viene creata un'istanza prima
dell'inizio dell'elaborazione dello script. Per specificare questa classe, aggiungi la chiave
MonkeyRunnerStartupRunner al manifest del file JAR. Per il valore, utilizza il nome della classe da eseguire all'avvio. Il seguente
snippet mostra come eseguire questa operazione all'interno di uno script di build ant:
<jar jarfile="myplugin" basedir="${build.dir}"> <manifest> <attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/> </manifest> </jar>
Per accedere all'ambiente di runtime dello strumento monkeyrunner, la classe di avvio può implementare
com.google.common.base.Predicate<PythonInterpreter>. Ad esempio, questa
classe configura alcune variabili nello spazio dei nomi predefinito:
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; } }