- Инструменты функционального тестирования — Monkey и MonkeyRunner
- Monkey
- MonkeyRunner
- Запускаем Monkey-testing на Android
- Как запустить приложение с помощью инструментов Android ADB?
- Автоматизация тестирования Android приложений
- Концепция автоматического тестирования
- Управление Android устройствами
- Управление с помощью утилиты ADB
- Проверка работы ADB
- Работа с несколькими устройствами
- Основные команды ADB
- Чтение логов
- Снятие скриншотов с помощью утилиты screencap
- Пример BASH скрипта для тестирования приложения c помощью ADB
- Управление с помощью MonkeyRunner
- Чтение логов с помощью MonkeyRunner
- Снятие скриншотов
- Пример управления устройством с помощью MonkeyRunner
- Средства автоматизированного тестирования
- Тестирование с помощью monkey
- Тестирование с помощью MonkeyRunner
- Тестирование с помощью getevent/sendevent
- Тестирование с помощью Robotium
- Сравнение способов тестирования
- Анализ результатов
- Анализ логов
- Анализ скриншотов
- Сброс состояния устройства после тестирования
- Многократное нажатие кнопки «Назад»
- Заключение
Инструменты функционального тестирования — Monkey и MonkeyRunner
Monkey
Начнём с самого простого инструмента — с Monkey. Monkey является не столько инструментом функционального тестирования, сколько т.н. стресс-тестирования, либо, как говорится на официальной странице документации проекта — UI/Application Exerciser. Грубо говоря, Monkey эмулирует попадание телефона с запущенным приложением в лапки к обезьянке (ну или в руки к маленькому ребенку), с последующими хаотичными действиями «пользователя». Впрочем, Monkey позволяет достаточно гибко настроить «хаотичность», интервал между событиями, их тип и т.п. Для подобного тестирования исходный код приложения не требуется — оно просто должно быть установлено на устройство либо эмулятор, а запуск в простейшем случае осуществляется следующим образом из консоли:
$ adb shell monkey -p org.monkeys -v 500
Указывается имя пакета вашего приложения и количество генерируемых событий. В случае возникновения исключения (Exception), соответствующий stack trace будет выведен в консоль:
Вот и все о Monkey — тестируйте свое приложение, и возможно, это сделает его более надежным — кто знает.
MonkeyRunner
Несмотря на схожее с Monkey название, MonkeyRunner совершенно другой инструмент, который позволяет выполнять функциональное тестирование приложения («прокликивающие» тесты), предоставляя API для управления устройством. MonkeyRunner является более низкоуровневым по сравнению с Robotium, и не требует исходного кода приложения в сравнении с Robolectric. Но только лишь тестированием область применения MonkeyRunner не ограничивается — с его помощью можно строить системы, контролирующие android-устройства через UI (и не только). MonkeyRunner использует Jython и скрипты или сценарии тестов могут быть написаны на Python, или записать действия пользователя с помощью рекордера.
Как уже было сказано, MonkeyRunner поставляется вместе в составе SDK, а сам интерпретатор и его интерактивная консоль могут быть запущены с помощью скрипта monkeyrunner , находящегося в каталоге tools SDK.
Запись и проигрывание сценария
Из состава SDK нам понадобятся два python-скрипта: для рекордера и плеера. Запускать их нужно соответственно с помощью monkeyrunner :
Рекордер выглядит примерно так:
С помощью кнопки «Export actions» сценарий может быть записан в файл, после чего его можно будет воспроизвести плеером:
Конечно же, эмулятор должен быть запущен при всех вышеперечисленных действиях.
Как видно из скриншота, MonkeyRunner оперирует координатами для выбора элемента управления, что конечно же не столь удобно, как выбор элемента в Robotium или Robolectric и будет зависеть от размеров экрана, но может быть, что такое поведение будет востребовано для создания сценариев тестирования приложений, не обладающих привычными элементами интерфейса — например, игр.
Написание сценария
MonkeyRunner позволяет описывать собственные сценарии с использованием Python. В дополнение к управлению интерфейсом возможны удаление и установка приложения, сохранение скриншотов и прочее. Пример такого скрипта:
Более подробно о возможностях, предоставляемых API можно узнать в официальной документации к MonkeyRunner.
Интеграция с Eclipse
Чтобы иметь возможность запускать свои сценарии из Eclipse достаточно будет сделать следующее:
- Установить расширение PyDev
- В настройках PyDev добавить новый Python-интерпретатор в качестве «Interpreter Executable» указав скрипт monkeyrunner (добавить именно как Python, а не Jython). Для старых версий SDK возможно понадобится скрипт-обертка.
- Добавить скрипты сценариев в их «Run configuration» указать для них только что добавленный интерпретатор.
Можно конечно создать для сценариев отдельный Python-проект.
Вот собственно и все, о чем хотелось вкратце рассказать. Возможно, описанные инструменты тестирования будут вам полезны.
Источник
Запускаем Monkey-testing на Android
В статье опишу, как запустить Monkey testing на Android с помощью встроенной утилиты. Называется она UI/Application Exerciser Monkey, или просто Обезьянка и позволяет провести стресс-тестирование вашего приложения.
Приложение генерирует огромное количество случайных действий, таких как нажатия, клики, тапы, свайпы, а так же нажатия на системные кнопки.
Установить Android SDK.
Установить тестируемое приложение на устройство \ эмулятор.
Узнать имя пакета Android приложения.
Для запуска в консоли пишем:
где packagename — имя пакета тестируемого приложения, например com.google.gms , а с помощю ключа -v мы передаём количество действий, выполняемых Обезъянкой, в нашем случае 500 .- количество необходимых действий и наблюдаем как быстро беспорядочно обезъянка тапаем по экрану нашего приложения.
В таком случае некоторые тапы попадют не только по приложению, но и по системным элементам. Для того, чтобы исключить взаимодействие обезъянки с системными кнопками (Home, Back, App, Sound) необходимо добавить ключ —pct-syskeys 0 , где 0 — коилчество тапо в по системным элементам в процентах, в нашем случае это 0%:
В таком варианте запуска между нажатиями по экрану пауза отсутствует. Для того, чтобы добавить паузу и иметь возможность наблюдать за происходящим на экране добавим ключ —throttle 100 — задержка в миллисекундах между нажатиями:
Ещё один полезный параметр — номер теста. Если при запуске мы задам номер теста, то при повторном запуске с таким же параметром последовательность действий будет идентична. Это полезно в случае, если во время теста была обнаружена проблема производительности (утекла память), то после исправления проблемы можно проверить с таким же параметром -s N, где N — номер теста. Номер можно автоматически инкрементировать, генерировать случайный или брать, например, номер сборки или ревизию из репозитория, как угодно:
Если во время теста случился крэш, то полезно остановить выполнение Обезъянки, чтобы она не продолжала свою работу. Для этого добавляем параметр —kill-process-after-error :
Источник
Как запустить приложение с помощью инструментов Android ADB?
Как отправить намерение с помощью инструментов Android ADB?
Или вы можете использовать это напрямую:
Вы также можете указать действия, которые будут фильтроваться вашими фильтрами намерений:
/ .bash_profile была намного быстрее function androidrun() < ant clean debug adb shell am start -n $1/$1.MainActivity >и ее использование androidrun com.example.test
Можно запустить приложение с указанием имени пакета только с помощью инструмента обезьяна , следуя этой схеме:
Команда используется для запуска приложения, используя инструмент обезьяны, который генерирует случайный ввод для приложения. Последняя часть команды — целое число, которое определяет количество сгенерированных случайных входных данных для приложения. В данном случае это номер 1, который фактически используется для запуска приложения (щелчок по значку).
Или вы можете использовать это:
/ android-sdk-linux / build-tools / 20.0.0 / aapt dump badging yourapp.apk, в котором будет показана следующая запись: launchable-activity: name = ‘com.company.android.package.YourLaunchableActivity’
Пользователи linux / mac могут также создать скрипт для запуска apk с чем-то вроде следующего:
создайте файл с именем «adb-run.sh» с этими 3 строками:
затем «chmod + x adb-run.sh», чтобы сделать его исполняемым.
теперь вы можете просто:
Преимущество в том, что вам не нужно знать имя пакета или имя запускаемой деятельности. Точно так же вы можете создать «adb-uninstall.sh myapp.apk»
Примечание: для этого необходимо, чтобы у вас был путь на вашем пути. Вы можете найти его в новой папке инструментов сборки в SDK.
Кроме того, я хочу упомянуть еще одну вещь.
Когда вы запускаете приложение из adb shell am , оно автоматически добавляет флаг FLAG_ACTIVITY_NEW_TASK, который меняет поведение. Смотрите код .
Например, если вы запускаете действие из Play Store из adb shell am , нажатие кнопки « Назад » (аппаратная кнопка «назад») не отнимает у вас ваше приложение, вместо этого вы перенесете предыдущую активность в Play Store, если она была (если не было задачи Play store). , тогда это займет у вас ваше приложение). Документация FLAG_ACTIVITY_NEW_TASK гласит:
если задача уже запущена для действия, которое вы сейчас запускаете, то новое действие не будет запущено; вместо этого текущее задание будет просто выведено на переднюю часть экрана с состоянием, в котором оно было последним
Это заставило меня потратить несколько часов, чтобы выяснить, что пошло не так.
Итак, имейте в виду, что adb shell am добавьте флаг FLAG_ACTIVITY_NEW_TASK .
Источник
Автоматизация тестирования Android приложений
Концепция автоматического тестирования
Задача — с наибольшей точностью автоматизировать действия, которые выполняет тестировщик. Давайте их рассмотрим. В наличии есть несколько приложений и несколько Android устройств. Для каждого приложения и каждого устройства выполняются следующие шаги:
- Установка приложения на устройство
- Запуск приложения
- Тестирование приложения выбранным способом
- Удаление приложения
- Сброс состояния устройства
На каждом шаге нужно собрать и проанализировать данные, например логи и скриншоты. Затем на основе этих данных сформировать результат тестирования.
Далее рассматриваются средства, позволяющие автоматизировать перечисленные шаги.
Управление Android устройствами
Для начала нужно выделить компьютер на котором будет запускаться автоматическое тестирование и настроить на нем Android SDK. Примеры приводятся для компьютера с установленной ОС Linux.
На всех тестируемых устройствах нужно отключить экран блокировки и максимально увеличить время ожидания. Для некоторых методов тестирования нужно отключить смену ориентации экрана.
В Android SDK имеются две утилиты для управления устройствами: adb и MonkeyRunner.
Я постараюсь подробно описать автоматизацию действий, использующихся при тестировании. Тем, кто знаком с ADB и MonkeyRunner имеет смысл сразу переходить к разделу «Способы автоматизированного тестирования».
Управление с помощью утилиты ADB
ADB (Android Debug Bridge) – утилита для управления Android устройствами из командной строки. Официальная документация по ADB: developer.android.com/tools/help/adb.html
Проверка работы ADB
Устанавливаем и настраиваем Android SDK, подключаем к компьютеру Android устройства и выполняем команду:
Команда выдаст список всех подключенных устройств. Если список устройств не пуст, значит ADB настроен и работает.
Работа с несколькими устройствами
Чтобы указать ADB с каким устройством нужно работать, следует прописать серийный номер устройства после ключа -s :
Серийный номер устройства можно посмотреть командой adb devices . Ключ -s позволяет работать одновременно с несколькими подключенными устройствами. В дальнейшем ключ -s в командах я указывать не буду.
Основные команды ADB
Открыть консоль на устройстве:
Запустить команду на устройстве:
В Android присутствуют многие стандартные утилиты Linux: ls, cat, dmesg,…
Установить приложение из apk файла:
Название package можно получить из apk файла командой:
Загрузить файл с устройства на компьютер:
Загрузить файл с компьютера на устройство:
Примечание:
В большинство директорий на устройстве разрешен доступ только на чтение. Доступ на запись разрешен в директорию /sdcard (из нее нельзя запускать программы) и /data/local/tmp/ .
Запускает указанную activity. Название activity, которая запускается при выборе приложения в меню можно получить из apk файла командой:
Чтение логов
Чтение логов в Android производится утилитой logcat.
Домашняя страница утилиты logcat: developer.android.com/tools/help/logcat.html
Считать логи с устройства (блокируется до нажатия Ctrl-C):
Очистить буфер логов на устройстве:
Считать буфер логов на устройстве (выдает текущее содержимое буфера, не блокируется):
Снятие скриншотов с помощью утилиты screencap
Утилита screencap сохраняет текущее содержимое экрана в графический файл:
Утилита screencap имеется на телефонах с Android 4.x и выше. На предыдущих версиях Android снятие скриншотов можно производить с помощью MonkeyRunner.
Пример BASH скрипта для тестирования приложения c помощью ADB
Управление с помощью MonkeyRunner
Утилита MonkeyRunner предоставляет API для написания скриптов, которые управляют Android устройстами. С помощью MonkeyRunner можно написать скрипт на языке Python, который устанавливает Android приложение, запускает его, имитирует действия пользователя, снимает скриншоты и сохраняет их на компьютер. Утилита MonkeyRunner использует Jython для выполнения скриптов.
Чтение логов с помощью MonkeyRunner
Скрипт запишет логи в файл example.log в текущей директории.
Снятие скриншотов
Скрипт снимает скриншот и сохраняет его в файл screenshot.png в текущей директории.
Пример управления устройством с помощью MonkeyRunner
Средства автоматизированного тестирования
Тестирование с помощью monkey
Представьте, что устройство попало в цепкие лапы очень активной и творческой обезьяны – утилита monkey призвана имитировать подобную ситуацию.
Утилита monkey входит в состав Android SDK. Утилита отправляет на устройство поток псевдо-случайных действий пользователя. Параметры командной строки задают количество действий пользователя, соотношение их типов и имя тестируемого пакета, чтобы, например, обезьяна не вышла за пределы тестируемого приложения и не начала рассылать SMS по всем контактам из адресной книги.
Примеры использования и перечень параметров приведены на домашней странице: developer.android.com/tools/help/monkey.html
Главное достоинство monkey – отсутствие затрат на поддержку. Кроме того, стресс-тестирование приложения потоком произвольных событий может обнаружить нетривиальные ошибки.
Недостатки тестирования утилитой monkey:
- Неэффективно для тестирования функционала, вызываемого сложной последовательностью действий. Например, monkey не сможет пройти аутентификацию и основной функционал приложения останется без внимания.
- Игры со сложным управлением, требующим быстрой реакции и сложных жестов, будут завершатся в самом начале, либо вообще не начнутся.
- Ошибки, найденные с помощью monkey, очень сложно воспроизвести.
- Нет проверки состояния приложения.
С помощью утилиты monkey можно без усилий протестировать любое приложение – это неплохая отправная точка. Возможно, что этот способ покажет адекватные результаты для конкретного приложения. Если же качество тестирования неудовлетворительное, то следует воспользоваться другими способами тестирования.
Тестирование с помощью MonkeyRunner
При помощи скриптов использующих MonkeyRunner API можно не только разработать основу для тестирующей системы, но и написать скрипты для тестирования конкретного приложения на конкретном устройстве.
Достоинства:
- Гибкость – реализовать можно практически все, что угодно.
Недостатки:
- Сложность написания скриптов даже в простых случаях.
Как правило, этот способ не оправдан – написание скриптов занимает много времени. Однако в частных случаях этот способ может сработать.
Тестирование с помощью getevent/sendevent
Утилиты getevent и sendevent позволяют записать последовательность действий пользователя, а затем воспроизвести эту последовательность. Утилиты находятся на самом Android-устройстве и не требуют для работы root-доступа.
Достоинства:
- Последовательности действий могут быть записаны без дополнительных затрат в ходе ручного тестирования, если оно уже проводится.
- Для записи сценариев не требуются навыки программирования.
Недостатки:
- Последовательности действий необходимо записывать отдельно для каждого приложения и для каждого устройства. При изменении интерфейса приложения все записанные действия необходимо проделать заново.
- Отсутствует проверка состояния приложения. Например, при тестировании браузера открывается страница. Если она открывается дольше, чем в момент записи, то дальнейшие действия будут выполнены до полной загрузки страницы и результат будет некорректный. Иногда возможно записать скрипт таким образом, что во всех подобных случаях ожидание превышает максимально возможное.
- Быстрая и сложная последовательность действий будет воспроизводиться дольше, чем записывалась – поэтому способ не всегда подойдет для тестирования динамичных игр, где критично время реакции и своевременность действия.
Запись последовательности действий:
На устройстве должны воспроизвестись записанные действия.
Тестирование с помощью Robotium
В отличии от рассмотренных ранее способов Robotium не входит в состав Android SDK, а распространяется под Open Source лицензией.
Главное отличие Robotium в том, что тестовые действия описываются на уровне интерфейса приложения. В рассмотренных ранее способах тестовые действия явно или неявно описывались на уровне устройств ввода.
Например, в приложении нужно нажать кнопку «OK». С помощью скрипта MonkeyRunner нажатие на кнопку реализуется как: «Коснуться точки экрана с координатами (x0, y0)». С помощью Robotium это реализуется как: «Нажать кнопку с текстом «OK»».
Когда действия описываются на уровне интерфейса приложения их можно сделать независимыми от расположения элементов интерфейса, разрешения экрана и положения устройства.
Кроме того, Robotium позволяет проверять реакцию приложения на действие.
Например, после нажатия на кнопку «OK» в приложении должен появиться список с элементом «Item 1». С помощью Robotium можно проверить, появился ли список с таким элементом.
Если выполнять проверки после каждого действия, то легко обнаружить, на каком шаге произошла ошибка.
Недостатки:
- Для каждого приложения необходимо разработать сценарий тестирования на языке Java. Это требует навыков программирования и временных затрат.
- При изменении интерфейса приложения сценарий тестирования придется модифицировать.
- Написать сценарий Robotium сложнее, чем записать действия с помощью getevent/sendevent.
В целом, Robotium позволяет разрабатывать наиболее качественные сценарии тестирования при адекватных затратах.
Сравнение способов тестирования
Способ тестирования | Достоинства | Недостатки |
---|---|---|
Monkey – поток случайных действий пользователя. | Отсутствуют затраты на сопровождение. Не зависит от устройства. Стресс-тестирование позволяет обнаружить нетривиальные ошибки. | Качество тестирования варьируется от приложения к приложению. Найденные ошибки сложно воспроизвести. Нет проверки состояния приложения. |
MonkeyRunner – скрипт управления устройством. | Гибкость. | Сложность написания и поддержки скриптов даже для простых приложений. |
getevent/sendevent – запись/воспроизведение действий пользователя. | Для записи последовательности действий не требуются навыки программирования. | Записанная последовательность действий подходит только к одному устройству при фиксированной ориентации. При изменении интерфейса приложения необходимо заново записать последовательность действий. Нет проверки состояния приложения. |
Robotium – сценарий тестирования интерфейса приложения с проверкой состояния. | Действия описываются на уровне интерфейса приложения. Сценарий может быть независимым от разрешения экрана и ориентации устройства. После совершения действия можно проверять состояние приложения. | Сложность написания сценариев на языке Java. При изменении интерфейса приложения сценарий придется модифицировать. |
Анализ результатов
В результате тестирования приложения перечисленными выше способами мы получили логи и скриншоты. Теперь их нужно проанализировать на наличие ошибок.
Анализ логов
Для начала можно сделать поиск по подстрокам:
- I/DEBUG
- FATAL EXCEPTION
- WIN DEATH
Список можно дополнять по мере выявления ошибок в ходе ручного тестирования.
Анализ скриншотов
В процессе тестирования вручную можно подготовить серию скриншотов в ключевых моментах тестирования, а затем сравнивать их с содержимым экрана в процессе автоматизированного тестирования. Это позволит определить, правильно ли идет процесс автоматизированного тестирования и выявлять ошибки.
Также полезно сравнивать скриншот до и после запуска приложения – это позволяет определять случаи, когда приложение аварийно завершается без сообщений на экране и в логах.
MonkeyRunner позволяет сравнить два скриншота с заданным допуском в процентах:
К сожалению, в API MonkeyImage не предусмотрена функция загрузки из файла. Поэтому для сравнения сохраненных скриншотов придется писать свою функцию, например с помощью Python Imaging Library.
Сброс состояния устройства после тестирования
После тестирования приложения устройство нужно вернуть в первоначальное состояние.
Этого можно достичь несколькими путями:
- Многократное нажатие кнопки «Назад».
- Перезагрузка устройства.
- Перезапуск процесса zygote.
Рассмотрим первый вариант, как наиболее адекватный.
Многократное нажатие кнопки «Назад»
Нажимаем кнопку «Назад» используя MonkeyRunner:
На практике этот вариант оптимален, так как имитирует поведение реального пользователя.
Заключение
В заметке были рассмотрены некоторые способы автоматического тестирования Android приложений, их достоинства и недостатки. Кроме того, рассмотрены инструменты, входящие в Android SDK или распространяющиеся под Open Source лицензией.
Хочется отметить, что автоматическое тестирование не является панацеей и не заменяет другие виды тестирования. Качественный продукт получается при грамотно построенном процессе тестирования, сочетающем различные способы.
Источник