бегун обезьян

Устаревший инструмент monkeyrunner предоставляет API для написания программ, которые управляют устройством Android или эмулятором из-за пределов кода Android.

Инструмент monkeyrunner в первую очередь предназначен для тестирования приложений и устройств на функциональном уровне/уровне платформы, а также для запуска наборов модульных тестов, но вы можете использовать его и для других целей. С помощью monkeyrunner вы можете написать программу на Python, которая устанавливает приложение Android или тестовый пакет, запускает его, отправляет на него нажатия клавиш, делает снимки экрана его пользовательского интерфейса и сохраняет снимки экрана на рабочей станции.

Внимание: API monkeyrunner не поддерживается. Вместо этого мы рекомендуем использовать инструмент App Crawler или платформу тестирования UI Automator .

Инструмент monkeyrunner не связан с UI/Application Tester Monkey , также известным как инструмент monkey . Инструмент monkey запускается в оболочке adb непосредственно на устройстве или эмуляторе и генерирует псевдослучайные потоки пользовательских и системных событий. Для сравнения, инструмент monkeyrunner управляет устройствами и эмуляторами с рабочей станции, отправляя определенные команды и события из API.

Инструмент monkeyrunner предоставляет следующие функции для тестирования Android:

  • Управление несколькими устройствами . API monkeyrunner может применять один или несколько наборов тестов на нескольких устройствах или эмуляторах. Вы можете физически подключить все устройства или запустить все эмуляторы (или оба) сразу, подключиться к каждому по очереди программно, а затем запустить один или несколько тестов. Вы также можете запустить конфигурацию эмулятора программным способом, запустить один или несколько тестов, а затем закрыть эмулятор.
  • Функциональное тестирование : monkeyrunner может запускать автоматическое комплексное тестирование приложения Android. Вы вводите входные значения с помощью нажатий клавиш или событий касания и просматриваете результаты в виде снимков экрана.
  • Регрессионное тестирование : monkeyrunner может проверить стабильность приложения, запустив его и сравнив выходные снимки экрана с набором заведомо правильных снимков экрана.
  • Расширяемая автоматизация : поскольку monkeyrunner представляет собой набор инструментов API, вы можете разработать систему модулей и программ на основе Python для управления устройствами Android. Помимо использования самого API monkeyrunner , вы можете использовать стандартную os Python и модули subprocess для вызова инструментов Android, таких как Android Debug Bridge .

    Вы также можете добавить свои собственные классы в API monkeyrunner . Более подробно это описано в разделе «Расширение Monkeyrunner с помощью плагинов» .

Инструмент monkeyrunner использует Jython , реализацию Python, использующую язык программирования Java. Jython позволяет API-интерфейсу monkeyrunner легко взаимодействовать с платформой Android. С Jython вы можете использовать синтаксис Python для доступа к константам, классам и методам API.

Простая программа «Monkeyrunner»

Вот простая программа monkeyrunner , которая подключается к устройству и создает объект MonkeyDevice . Используя объект MonkeyDevice , программа устанавливает пакет приложения Android, запускает одно из своих действий и отправляет этому действию ключевые события. Затем программа делает снимок экрана с результатом, создавая объект MonkeyImage . Из этого объекта программа записывает PNG-файл, содержащий скриншот.

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

API обезьяньего бегуна

API monkeyrunner содержится в трех модулях пакета com.android.monkeyrunner :

  • MonkeyRunner : класс служебных методов для программ monkeyrunner . Этот класс предоставляет метод подключения monkeyrunner к устройству или эмулятору. Он также предоставляет методы для создания пользовательских интерфейсов для программы monkeyrunner и для отображения встроенной справки.
  • MonkeyDevice : представляет устройство или эмулятор. Этот класс предоставляет методы для установки и удаления пакетов, запуска действия и отправки событий клавиатуры или касания в приложение. Вы также используете этот класс для запуска тестовых пакетов.
  • MonkeyImage : представляет собой снимок экрана. Этот класс предоставляет методы для захвата экранов, преобразования растровых изображений в различные форматы, сравнения двух объектов MonkeyImage и записи изображения в файл.

В программе Python вы получаете доступ к каждому классу как к модулю Python. Инструмент monkeyrunner не импортирует эти модули автоматически. Чтобы импортировать модуль, используйте оператор Python from :

from com.android.monkeyrunner import <module>

Где <module> — имя класса, который вы хотите импортировать. Вы можете импортировать более одного модуля в одну инструкцию from , разделяя имена модулей запятыми.

Беги обезьяна-бегун

Вы можете запускать программы monkeyrunner либо из файла, либо вводя операторы monkeyrunner в интерактивном сеансе. Вы делаете и то, и другое, вызывая команду monkeyrunner , которая находится в подкаталоге tools/ вашего каталога SDK. Если вы укажете имя файла в качестве аргумента, команда monkeyrunner запустит содержимое файла как программу Python; в противном случае он запускает интерактивный сеанс.

Ниже приведен синтаксис команды monkeyrunner :

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

В таблице 1 поясняются флаги и аргументы monkeyrunner .

Таблица 1. Флаги и аргументы monkeyrunner

Аргумент Описание
-plugin <plugin_jar> (Необязательно) Указывает файл JAR, содержащий плагин для monkeyrunner . Чтобы узнать больше о плагинах monkeyrunner , см. раздел «Расширение Monkeyrunner с помощью плагинов» . Чтобы указать более одного файла, включите аргумент несколько раз.
<program_filename> Если вы укажете этот аргумент, команда monkeyrunner запускает содержимое файла как программу Python. В противном случае команда запускает интерактивный сеанс.
<program_options> (Необязательно) Флаги и аргументы программы в <program_file> .

встроенная справка Monkeyrunner

Вы можете создать ссылку API для monkeyrunner , выполнив:

monkeyrunner help.py <format> <outfile>

Аргументы:

  • <format> — это либо text для вывода в виде обычного текста, либо html для вывода в формате HTML.
  • <outfile> — это имя выходного файла с указанием пути.

Расширьте Monkeyrunner с помощью плагинов

Вы можете расширить API monkeyrunner с помощью классов, написанных вами на Java, и встроить их в один или несколько файлов JAR. Вы можете использовать эту функцию, чтобы расширить API monkeyrunner своими собственными классами или расширить существующие классы. Вы также можете использовать эту функцию для инициализации среды monkeyrunner .

Чтобы предоставить плагин для monkeyrunner , вызовите команду monkeyrunner с аргументом -plugin <plugin_jar> , описанным в таблице 1 .

В коде вашего плагина вы можете импортировать и расширить основные классы monkeyrunner MonkeyDevice , MonkeyImage и MonkeyRunner в com.android.monkeyrunner (см. раздел об API monkeyrunner ).

Обратите внимание, что плагины не предоставляют вам доступ к Android SDK. Вы не можете импортировать такие пакеты, как com.android.app . Это связано с тем, что monkeyrunner взаимодействует с устройством или эмулятором ниже уровня API-интерфейсов платформы.

Класс запуска плагина

Файл JAR для плагина может указывать класс, экземпляр которого создается до начала обработки сценария. Чтобы указать этот класс, добавьте ключ MonkeyRunnerStartupRunner в манифест файла JAR. В качестве значения используйте имя класса, который будет запускаться при запуске. В следующем фрагменте показано, как это сделать в сценарии сборки ant :

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


Чтобы получить доступ к среде выполнения инструмента monkeyrunner , класс запуска может реализовать com.google.common.base.Predicate<PythonInterpreter> . Например, этот класс устанавливает некоторые переменные в пространстве имен по умолчанию:

Котлин

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

Ява

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