biegacz z małpką

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

Narzędzie monkeyrunner jest przeznaczone przede wszystkim do testowania aplikacji i urządzeń na poziomie funkcjonalności lub platformy oraz uruchamianie pakietów testów jednostkowych. Może być jednak wykorzystywane do innych celów. Za pomocą monkeyrunner możesz napisać program w Pythonie, który instaluje aplikację na Androida lub pakiet testowy, uruchamia ją, wysyła naciśnięcia klawiszy, wykonuje zrzuty ekranu interfejsu użytkownika i zapisuje zrzuty ekranu na stacji roboczej.

Uwaga: interfejs API monkeyrunner nie jest obsługiwany. Zamiast tego zalecamy skorzystanie z narzędzia Indeksowanie aplikacji lub Automatyzatora interfejsu użytkownika.

Narzędzie monkeyrunner nie jest związane z interfejsem użytkownika/małpką do ćwiczenia aplikacji, znaną też jako narzędzie monkey. Narzędzie monkey działa w powłoce adb bezpośrednio na urządzeniu lub w emulatorze i generuje pseudolosowe strumienie zdarzeń użytkownika i systemu. Dla porównania narzędzie monkeyrunner steruje urządzeniami i emulatorami na stacji roboczej przez wysyłanie określonych poleceń i zdarzeń z interfejsu API.

Podczas testowania aplikacji na Androidzie narzędzie monkeyrunner udostępnia te funkcje:

  • Sterowanie wieloma urządzeniami: interfejs API monkeyrunner może zastosować co najmniej 1 pakiet testowy na wielu urządzeniach lub emulatorach. Możesz fizycznie podłączyć wszystkie urządzenia lub uruchomić wszystkie emulatory (albo oba) jednocześnie, połączyć się z nimi za pomocą oprogramowania programowego i przeprowadzić co najmniej 1 test. Możesz też automatycznie uruchomić konfigurację emulatora, przeprowadzić co najmniej 1 test, a potem wyłączyć emulator.
  • Testy funkcjonalne: monkeyrunner może przeprowadzać automatyczny test od początku do końca aplikacji na Androida. Wpisz wartości wejściowe za pomocą kombinacji klawiszy lub zdarzeń dotknięcia, a wyniki wyświetlą się w postaci zrzutów ekranu.
  • Testowanie regresji: monkeyrunner może sprawdzić stabilność aplikacji, uruchamiając aplikację i porównując jej zrzuty ekranu z zestawem zrzutów ekranu, o których wiadomo, że jest prawidłowe.
  • Rozszerzona automatyzacja: monkeyrunner to zestaw narzędzi interfejsu API, dlatego możesz opracować system modułów i programów w języku Python do sterowania urządzeniami z Androidem. Poza korzystaniem z interfejsu API monkeyrunner możesz też używać standardowych modułów os i subprocess Pythona do wywoływania narzędzi dla Androida, takich jak Android Debug Bridge.

    Do interfejsu API monkeyrunner możesz też dodawać własne klasy. Szczegółowo opisujemy to w sekcji Rozszerzanie aplikacji Monkeyrunner za pomocą wtyczek.

Narzędzie monkeyrunner używa Jython – implementacji Pythona wykorzystującej język programowania Java. Jython umożliwia łatwą interakcję interfejsu API monkeyrunner z platformą Androida. Dzięki Jython możesz korzystać ze składni Pythona, aby uzyskać dostęp do stałych, klas i metod interfejsu API.

Prosty program „małkeyrunner”

Oto prosty program monkeyrunner, który łączy się z urządzeniem i tworzy obiekt MonkeyDevice. Za pomocą obiektu MonkeyDevice program instaluje pakiet aplikacji na Androida, uruchamia jedną ze swoich działań i wysyła do niej kluczowe zdarzenia. Następnie program robi zrzut ekranu z wynikiem i tworzy obiekt MonkeyImage. Z tego obiektu program zapisuje 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 API Monkeyrunner

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 również metody tworzenia interfejsów użytkownika dla programu monkeyrunner i wyświetlania wbudowanej pomocy.
  • MonkeyDevice: reprezentuje urządzenie lub emulator. Ta klasa udostępnia metody instalowania i odinstalowywania pakietów, uruchamiania aktywności oraz wysyłania do aplikacji zdarzeń z klawiatury lub dotknięcia. Korzystasz z niej również do uruchamiania pakietów testowych.
  • MonkeyImage: reprezentuje zrzut ekranu. Ta klasa udostępnia metody przechwytywania ekranu, konwertowania obrazów bitmapowych na różne formaty, porównywania 2 obiektów MonkeyImage oraz zapisywania obrazu w pliku.

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

from com.android.monkeyrunner import <module>

Gdzie <module> to nazwa zajęć, które chcesz zaimportować. W tej samej instrukcji from można zaimportować więcej niż 1 moduł, rozdzielając nazwy modułów przecinkami.

Graj jako łowca małp

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

Oto składnia polecenia monkeyrunner:

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

W tabeli 1 znajdziesz informacje o flagach i argumentach monkeyrunner.

Tabela 1. Flagi i argumenty monkeyrunner

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

wbudowana pomoc „małkeyrunner”

Aby wygenerować dokumentację API dla monkeyrunner, uruchom polecenie:

monkeyrunner help.py <format> <outfile>

Argumenty to:

  • <format> to text w przypadku zwykłego tekstu lub html w przypadku danych wyjściowych HTML.
  • <outfile> to nazwa kwalifikująca się do ścieżki dla pliku wyjściowego.

Rozszerz aplikację Monkeyrunner za pomocą wtyczek

Możesz rozszerzyć interfejs API monkeyrunner o klasy pisane w Javie i wbudować w pliki JAR. Możesz użyć tej funkcji, aby rozszerzyć interfejs API monkeyrunner o własne klasy lub rozszerzyć istniejące klasy. Za pomocą tej funkcji możesz też zainicjować środowisko monkeyrunner.

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

W kodzie wtyczki możesz zaimportować i rozszerzyć główne klasy monkeyrunner MonkeyDevice, MonkeyImage i MonkeyRunner w com.android.monkeyrunner (zapoznaj się z sekcją na temat interfejsu monkeyrunner API).

Pamiętaj, że wtyczki nie dają dostępu do pakietu Android SDK. Nie można importować pakietów, takich jak com.android.app. Wynika to z tego, że monkeyrunner wchodzi w interakcję z urządzeniem lub emulatorem poniżej poziomu interfejsów API platformy.

Klasa startowa 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 pliku JAR. Jako wartości wpisz nazwę klasy, która ma być uruchamiana przy uruchamianiu. Ten 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 wdrożyć dyrektywę com.google.common.base.Predicate<PythonInterpreter>. Ta klasa konfiguruje na przykład pewne 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;
    }
}