Устаревший инструмент monkeyrunner предоставляет API для написания программ, которые управляют устройством Android или эмулятором извне кода Android.
Инструмент monkeyrunner в основном предназначен для тестирования приложений и устройств на уровне фреймворка и функций, а также для запуска наборов модульных тестов, но его можно использовать и для других целей. С помощью monkeyrunner вы можете написать программу на Python, которая устанавливает приложение Android или тестовый пакет, запускает его, отправляет ему нажатия клавиш, делает скриншоты его пользовательского интерфейса и сохраняет их на рабочей станции.
Внимание! API monkeyrunner не поддерживается. Вместо него мы рекомендуем использовать фреймворк UI Automator.
Инструмент monkeyrunner не связан с UI/Application Exerciser Monkey, также известным как monkey. Инструмент monkey запускается в оболочке adb непосредственно на устройстве или в эмуляторе и генерирует псевдослучайные потоки пользовательских и системных событий. В отличие от него, инструмент monkeyrunner управляет устройствами и эмуляторами с рабочей станции, отправляя определенные команды и события из API.
Инструмент monkeyrunner предоставляет следующие возможности для тестирования на Android:
-
Управление несколькими устройствами.
monkeyrunnerAPI может применять один или несколько наборов тестов на нескольких устройствах или эмуляторах. Вы можете физически подключить все устройства или запустить все эмуляторы (или и то, и другое) одновременно, программно подключиться к каждому из них по очереди, а затем запустить один или несколько тестов. Вы также можете программно запустить конфигурацию эмулятора, выполнить один или несколько тестов, а затем выключить эмулятор. -
Функциональное тестирование.
monkeyrunnerможет автоматически выполнить полное тестирование приложения для Android. Вы вводите значения с помощью нажатий клавиш или событий касания и просматриваете результаты в виде скриншотов. -
Регрессионное тестирование.
monkeyrunnerможет проверить стабильность приложения, запустив его и сравнив скриншоты с набором скриншотов, которые считаются правильными. -
Расширяемая автоматизация. Поскольку
monkeyrunner– это набор инструментов API, вы можете разработать систему модулей и программ на основе Python для управления устройствами Android. Помимо самого APImonkeyrunner, вы можете использовать стандартные модули Pythonosиsubprocessдля вызова инструментов Android, таких как Android Debug Bridge.Вы также можете добавлять собственные классы в
monkeyrunnerAPI. Подробнее об этом рассказывается в разделе Расширение 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')
Monkeyrunner 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 в интерактивном сеансе. Для этого нужно вызвать команду 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-файлов. С помощью этой функции вы можете расширить monkeyrunner API собственными классами или расширить существующие классы. Вы также можете использовать эту функцию для инициализации среды 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>. Например, этот класс задает некоторые переменные в пространстве имен по умолчанию:
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; } }