biegacz z małpką

Starsze narzędzie monkeyrunner udostępnia interfejs API do pisania programów, które sterują urządzeniem z Androidem lub emulatorem spoza kodu Androida.

Narzędzie monkeyrunner jest przeznaczone głównie do testowania aplikacji i urządzeń na poziomie funkcjonalnym lub strukturalnym oraz do uruchamiania pakietów testów jednostkowych, ale możesz go używać do innych celów. Za pomocą monkeyrunner możesz napisać program w języku Python, który zainstaluje aplikację na Androida lub pakiet testowy, uruchomi go, wyśle do niego naciśnięcia klawiszy, zrobi zrzuty ekranu interfejsu użytkownika i zapisze je na stacji roboczej.

Ostrzeżenie: interfejs API monkeyrunner nie jest już obsługiwany. Zamiast tego zalecamy używanie platformy testowej UI Automator.

Narzędzie monkeyrunner nie jest powiązane z UI/Application Exerciser Monkey, znanym też jako narzędzie monkey. Narzędzie monkey działa w powłoce adb bezpośrednio na urządzeniu lub emulatorze i generuje pseudolosowe strumienie zdarzeń użytkownika i systemowych. W porównaniu z tym narzędzie monkeyrunner steruje urządzeniami i emulatorami z poziomu stacji roboczej, wysyłając określone polecenia i zdarzenia z interfejsu API.

monkeyrunner Narzędzie udostępnia te funkcje do testowania Androida:

  • Sterowanie wieloma urządzeniami: interfejs monkeyrunner API może stosować co najmniej jeden zestaw testów na wielu urządzeniach lub emulatorach. Możesz jednocześnie podłączyć wszystkie urządzenia lub uruchomić wszystkie emulatory (albo zrobić jedno i drugie), połączyć się z każdym z nich programowo, a następnie przeprowadzić co najmniej 1 test. Możesz też uruchomić konfigurację emulatora programowo, przeprowadzić co najmniej 1 test, a potem wyłączyć emulator.
  • Testowanie funkcjonalne: monkeyrunner może przeprowadzić automatyczny test aplikacji na Androida od początku do końca. Podajesz dane wejściowe za pomocą naciśnięć klawiszy lub zdarzeń dotykowych i wyświetlasz wyniki w postaci zrzutów ekranu.
  • Testy regresyjne: monkeyrunner może testować stabilność aplikacji, uruchamiając ją i porównując zrzuty ekranu z jej działania z zestawem zrzutów ekranu, które są prawidłowe.
  • Rozszerzalna automatyzacja: monkeyrunner to zestaw narzędzi API, więc możesz opracować system modułów i programów opartych na Pythonie do sterowania urządzeniami z Androidem. Oprócz samego interfejsu monkeyrunner API możesz używać standardowych modułów Pythona ossubprocess do wywoływania narzędzi Androida, takich jak Android Debug Bridge.

    Możesz też dodać własne zajęcia do interfejsu monkeyrunner API. Szczegółowe informacje znajdziesz w sekcji Rozszerzanie narzędzia monkeyrunner za pomocą wtyczek.

Narzędzie monkeyrunner korzysta z  Jythona, czyli implementacji Pythona, która używa języka programowania Java. Jython umożliwia interfejsowi API monkeyrunner łatwą interakcję z platformą Androida. Jython umożliwia dostęp do stałych, klas i metod interfejsu API za pomocą składni Pythona.

Prosty program monkeyrunner

Oto prosty program w języku monkeyrunner, który łączy się z urządzeniem i tworzy obiekt MonkeyDevice. Za pomocą obiektu MonkeyDevice program instaluje pakiet aplikacji na Androida, uruchamia jedno z jego działań i wysyła do niego kluczowe zdarzenia. Program zrobi wtedy zrzut ekranu z wynikiem, tworząc obiekt MonkeyImage. Program zapisuje z tego obiektu plik PNG zawierający zrzut ekranu.

# 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')

Interfejs monkeyrunner API

Interfejs monkeyrunner API znajduje się w 3 modułach w pakiecie com.android.monkeyrunner:

  • MonkeyRunner:Klasa metod narzędziowych dla programów monkeyrunner. Ta klasa udostępnia metodę łączenia monkeyrunner z urządzeniem lub emulatorem. Udostępnia też metody tworzenia interfejsów programów i wyświetlania wbudowanej pomocy.monkeyrunner
  • MonkeyDevice: Reprezentuje urządzenie lub emulator. Ta klasa udostępnia metody instalowania i odinstalowywania pakietów, uruchamiania Activity oraz wysyłania do aplikacji zdarzeń klawiatury lub dotyku. Za pomocą tej klasy możesz też uruchamiać pakiety testowe.
  • MonkeyImage: Reprezentuje obraz zrzutu ekranu. Ta klasa udostępnia metody przechwytywania ekranów, konwertowania obrazów bitmapowych do różnych formatów, porównywania dwóch obiektów MonkeyImage i zapisywania obrazu w pliku.

W programie w Pythonie masz dostęp do każdej klasy jako modułu Pythona. Narzędzie monkeyrunner nie importuje tych modułów automatycznie. Aby zaimportować moduł, użyj instrukcji from w języku Python:

from com.android.monkeyrunner import <module>

gdzie <module> to nazwa zajęć, które chcesz zaimportować. W tym samym wyrażeniu from możesz zaimportować więcej niż 1 moduł, oddzielając nazwy modułów przecinkami.

Uruchamianie narzędzia monkeyrunner

Programy monkeyrunner możesz uruchamiać z pliku lub wpisując instrukcje monkeyrunner w sesji interaktywnej. Aby to zrobić, wywołaj polecenie monkeyrunner, które znajduje się w podkatalogu tools/ katalogu pakietu SDK. Jeśli podasz nazwę pliku jako argument, polecenie monkeyrunner uruchomi zawartość pliku jako program w Pythonie. W przeciwnym razie rozpocznie sesję interaktywną.

Oto składnia polecenia monkeyrunner:

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

W tabeli 1 wyjaśniono flagi i argumenty monkeyrunner.

Tabela 1. monkeyrunner flagi i argumenty,

Argument Opis
-plugin <plugin_jar> (Opcjonalnie) Określa plik JAR zawierający wtyczkę do monkeyrunner. Więcej informacji o monkeyrunnerwtyczkach znajdziesz w sekcji Rozszerzanie monkeyrunnera za pomocą wtyczek. Aby określić więcej niż 1 plik, podaj argument kilka razy.
<program_filename> Jeśli podasz ten argument, polecenie monkeyrunner uruchomi zawartość pliku jako program w Pythonie. W przeciwnym razie polecenie rozpocznie sesję interaktywną.
<program_options> (Opcjonalnie) Flagi i argumenty programu w <program_file>.

Wbudowana pomoc monkeyrunner

Dokumentację interfejsu API monkeyrunner możesz wygenerować, uruchamiając to polecenie:

monkeyrunner help.py <format> <outfile>

Argumenty to:

  • <format> to text w przypadku danych wyjściowych w formacie zwykłego tekstu lub html w przypadku danych wyjściowych w formacie HTML.
  • <outfile> to nazwa pliku wyjściowego z pełną ścieżką.

Rozszerzanie narzędzia monkeyrunner za pomocą wtyczek

Możesz rozszerzyć interfejs monkeyrunner API o klasy napisane w języku Java i skompilowane w co najmniej 1 pliku JAR. Możesz użyć tej funkcji, aby rozszerzyć interfejs API monkeyrunner o własne klasy lub rozszerzyć istniejące klasy. Możesz też użyć tej funkcji do zainicjowania środowiska monkeyrunner.

Aby udostępnić wtyczkę usłudze monkeyrunner, wywołaj polecenie monkeyrunner z argumentem -plugin <plugin_jar> opisanym w tabeli 1.

W kodzie wtyczki możesz importować i rozszerzać główne klasy monkeyrunner, MonkeyDevice, MonkeyImageMonkeyRunnercom.android.monkeyrunner (więcej informacji znajdziesz w sekcji dotyczącej interfejsu monkeyrunner API).

Pamiętaj, że wtyczki nie zapewniają dostępu do pakietu Android SDK. Nie możesz importować pakietów, takich jak com.android.app. Dzieje się tak, ponieważ monkeyrunner wchodzi w interakcję z urządzeniem lub emulatorem poniżej poziomu interfejsów API platformy.

Klasa uruchamiania wtyczki

Plik JAR wtyczki może określać klasę, która jest tworzona przed rozpoczęciem przetwarzania skryptu. Aby określić tę klasę, dodaj klucz MonkeyRunnerStartupRunner do pliku manifestu JAR. Jako wartość podaj nazwę klasy, która ma być uruchamiana przy uruchamianiu. Poniższy fragment kodu pokazuje, jak to zrobić w skrypcie kompilacji ant:

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

Aby uzyskać dostęp do środowiska wykonawczego narzędzia monkeyrunner, klasa startowa może zaimplementować com.google.common.base.Predicate<PythonInterpreter>. Na przykład ta klasa ustawia niektóre zmienne w domyślnej przestrzeni nazw:

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;
    }
}