Устаревший инструмент monkeyrunner предоставляет API для написания программ, которые управляют устройством или эмулятором Android извне кода Android.
Инструмент monkeyrunner в первую очередь предназначен для тестирования приложений и устройств на функциональном уровне/уровне фреймворка, а также для запуска наборов модульных тестов, но его можно использовать и для других целей. С помощью monkeyrunner вы можете написать программу на Python, которая устанавливает приложение Android или тестовый пакет, запускает его, отправляет ему нажатия клавиш, делает снимки экрана пользовательского интерфейса и сохраняет снимки экрана на рабочей станции.
Внимание: API monkeyrunner больше не поддерживается. Мы рекомендуем использовать вместо него фреймворк тестирования UI Automator .
Инструмент monkeyrunner не имеет отношения к UI/Application Exerciser Monkey , также известному как monkey tool. Инструмент monkey запускается в оболочке adb непосредственно на устройстве или эмуляторе и генерирует псевдослучайные потоки пользовательских и системных событий. В отличие от него, инструмент monkeyrunner управляет устройствами и эмуляторами с рабочей станции, отправляя определенные команды и события через API.
Инструмент monkeyrunner предоставляет следующие возможности для тестирования Android:
- Управление несколькими устройствами : API
monkeyrunnerпозволяет применять один или несколько наборов тестов к нескольким устройствам или эмуляторам. Вы можете физически подключить все устройства или запустить все эмуляторы (или и то, и другое) одновременно, программно подключиться к каждому из них по очереди, а затем запустить один или несколько тестов. Вы также можете программно запустить конфигурацию эмулятора, запустить один или несколько тестов, а затем остановить эмулятор. - Функциональное тестирование :
monkeyrunnerможет запускать автоматизированное тестирование Android-приложения от начала до конца. Вы вводите значения с помощью нажатий клавиш или событий касания, а результаты просматриваете в виде скриншотов. - Регрессионное тестирование :
monkeyrunnerможет проверить стабильность приложения, запустив его и сравнив полученные скриншоты с набором заведомо корректных скриншотов. - Расширяемая автоматизация : поскольку
monkeyrunner— это набор инструментов API, вы можете разработать систему модулей и программ на основе Python для управления устройствами Android. Помимо использования самого APImonkeyrunner, вы можете использовать стандартные модули Pythonosиsubprocessдля вызова инструментов Android, таких как Android Debug Bridge .Вы также можете добавлять собственные классы в API
monkeyrunner. Более подробно это описано в разделе «Расширение функционала MonkeyRunner с помощью плагинов» .
Инструмент monkeyrunner использует Jython , реализацию Python, которая, в свою очередь, использует язык программирования Java. Jython позволяет API monkeyrunner легко взаимодействовать с фреймворком Android. С помощью Jython вы можете использовать синтаксис Python для доступа к константам, классам и методам API.
Простая программа для игры в "Бегущий по обезьяне".
Вот простая программа 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 для игры Monkeyrunner
API monkeyrunner содержится в трех модулях пакета com.android.monkeyrunner :
-
MonkeyRunner: Класс вспомогательных методов для программmonkeyrunner. Этот класс предоставляет метод для подключенияmonkeyrunnerк устройству или эмулятору. Он также предоставляет методы для создания пользовательских интерфейсов для программыmonkeyrunnerи для отображения встроенной справки. -
MonkeyDevice: Представляет устройство или эмулятор. Этот класс предоставляет методы для установки и удаления пакетов, запуска Activity и отправки событий клавиатуры или сенсорного экрана в приложение. Вы также используете этот класс для запуска тестовых пакетов. -
MonkeyImage: Представляет собой изображение, полученное при захвате экрана. Этот класс предоставляет методы для захвата экрана, преобразования растровых изображений в различные форматы, сравнения двух объектовMonkeyImageи записи изображения в файл.
В программе на Python вы обращаетесь к каждому классу как к модулю Python. Инструмент monkeyrunner не импортирует эти модули автоматически. Для импорта модуля используйте оператор ` from Python:
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 } }
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; } }