Pull to refresh

Инструменты функционального тестирования — Monkey и MonkeyRunner

Reading time 4 min
Views 48K
В заметке пойдет речь о двух инструментах функционального тестирования android-приложений, которые поставляются вместе с Android SDK, но не очень известны. Несмотря на очень схожие названия, предназначены они для несколько различных целей, и отличаются от других известных инструментов, например, от Robotium'а. Кому интересно — прошу под кат.

Monkey


Начнём с самого простого инструмента — с Monkey. Monkey является не столько инструментом функционального тестирования, сколько т.н. стресс-тестирования, либо, как говорится на официальной странице документации проекта — UI/Application Exerciser. Грубо говоря, Monkey эмулирует попадание телефона с запущенным приложением в лапки к обезьянке (ну или в руки к маленькому ребенку), с последующими хаотичными действиями «пользователя». Впрочем, Monkey позволяет достаточно гибко настроить «хаотичность», интервал между событиями, их тип и т.п. Для подобного тестирования исходный код приложения не требуется — оно просто должно быть установлено на устройство либо эмулятор, а запуск в простейшем случае осуществляется следующим образом из консоли:

$ adb shell monkey -p org.monkeys -v 500

Указывается имя пакета вашего приложения и количество генерируемых событий. В случае возникновения исключения (Exception), соответствующий stack trace будет выведен в консоль:

:Sending Pointer ACTION_MOVE x=-4.0 y=2.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
// CRASH: org.monkeys (pid 325)
// Short Msg: java.lang.NoSuchMethodException
// Long Msg: java.lang.NoSuchMethodException: onButtonClick
...
// java.lang.IllegalStateException: Could not find a method onButtonClick(View) in the activity class org.monkeys.MonkeysTestActivity for onClick handler on view class android.widget.Button
// 	at android.view.View$1.onClick(View.java:2059)
// 	at android.view.View.performClick(View.java:2408)
...
** Monkey aborted due to error.
Events injected: 17
:Dropped: keys=0 pointers=0 trackballs=0 flips=0
## Network stats: elapsed time=1479ms (1479ms mobile, 0ms wifi, 0ms not connected)
** System appears to have crashed at event 17 of 500 using seed 0


Вот и все о Monkey — тестируйте свое приложение, и возможно, это сделает его более надежным — кто знает.

MonkeyRunner



Несмотря на схожее с Monkey название, MonkeyRunner совершенно другой инструмент, который позволяет выполнять функциональное тестирование приложения («прокликивающие» тесты), предоставляя API для управления устройством. MonkeyRunner является более низкоуровневым по сравнению с Robotium, и не требует исходного кода приложения в сравнении с Robolectric. Но только лишь тестированием область применения MonkeyRunner не ограничивается — с его помощью можно строить системы, контролирующие android-устройства через UI (и не только). MonkeyRunner использует Jython и скрипты или сценарии тестов могут быть написаны на Python, или записать действия пользователя с помощью рекордера.

Как уже было сказано, MonkeyRunner поставляется вместе в составе SDK, а сам интерпретатор и его интерактивная консоль могут быть запущены с помощью скрипта monkeyrunner, находящегося в каталоге tools SDK.

Запись и проигрывание сценария


Из состава SDK нам понадобятся два python-скрипта: для рекордера и плеера. Запускать их нужно соответственно с помощью monkeyrunner:

monkeyrunner ~/Projects/MonkeysTest/monkeyrunner/monkey_recorder.py


Рекордер выглядит примерно так:


С помощью кнопки «Export actions» сценарий может быть записан в файл, после чего его можно будет воспроизвести плеером:

monkeyrunner ~/Projects/MonkeysTest/monkeyrunner/monkey_playback.py /tmp/actions.out


Конечно же, эмулятор должен быть запущен при всех вышеперечисленных действиях.

Как видно из скриншота, MonkeyRunner оперирует координатами для выбора элемента управления, что конечно же не столь удобно, как выбор элемента в Robotium или Robolectric и будет зависеть от размеров экрана, но может быть, что такое поведение будет востребовано для создания сценариев тестирования приложений, не обладающих привычными элементами интерфейса — например, игр.

Написание сценария


MonkeyRunner позволяет описывать собственные сценарии с использованием Python. В дополнение к управлению интерфейсом возможны удаление и установка приложения, сохранение скриншотов и прочее. Пример такого скрипта:

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

device = MonkeyRunner.waitForConnection()

device.removePackage('org.monkeys')
device.installPackage('/tmp/monkeys.apk')

package = 'org.monkeys'
activity = 'org.monkeys.MonkeysTestActivity'

runComponent = package + '/' + activity
device.startActivity(component=runComponent)

MonkeyRunner.sleep(2.0)

device.touch(50, 140, 'DOWN_AND_UP')

device.type("Hello!")

MonkeyRunner.sleep(1.0)
device.takeSnapshot().writeToFile('/tmp/monkeyshot.png','png')


Более подробно о возможностях, предоставляемых API можно узнать в официальной документации к MonkeyRunner.

Интеграция с Eclipse


Чтобы иметь возможность запускать свои сценарии из Eclipse достаточно будет сделать следующее:
  1. Установить расширение PyDev
  2. В настройках PyDev добавить новый Python-интерпретатор в качестве «Interpreter Executable» указав скрипт monkeyrunner (добавить именно как Python, а не Jython). Для старых версий SDK возможно понадобится скрипт-обертка.
  3. Добавить скрипты сценариев в их «Run configuration» указать для них только что добавленный интерпретатор.


Можно конечно создать для сценариев отдельный Python-проект.

Вот собственно и все, о чем хотелось вкратце рассказать. Возможно, описанные инструменты тестирования будут вам полезны.
Tags:
Hubs:
+26
Comments 2
Comments Comments 2

Articles