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

Устаревший инструмент 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. Помимо использования самого API monkeyrunner , вы можете использовать стандартные модули Python os и 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;
    }
}