Google UIAutomator убил все наши наработки за почти 3 года, но ему это можно простить!

Блестящее нативное решения для автоматизации тестирования UI с Android 4.1+ от Google.Для тех кто в теме: http://developer.android.com/tools/help/uiautomator/index.html
Тем, кто любит почитать, а затем составить собственное мнение посвящен весь текст дальше 🙂
Немного предыстории: Годами мы писали свои кастыли, через хаки, трики и что угодно, лишь бы подчинить девайс своей воле и заставить его выполнять строго определенный сценарий. Мы дошли до того, что даже стали использовать CNC машины, библиотеки “компьютерного зрения” для анализа изображения и определения следующего клика. Немало мы промучались и с мощным, но со смешным именем Sikuli. Чего мы только не перепробывали! Верхушка айсберга кастылезации, с чего все начиналось почти 3 года назад здесь:

Одним словом, выстрадали мы немало, даже создали собственную IDE для Android авто тестов.
И в один прекрасный день, вся проделанная работа сразу стала неактуальной, как минимум для устройств с Android 4.1 и выше 🙂 Первое ощущение – горечь поражения, но после выходных с этим чудо творением – счастье, что наконец-то можно сконцентрироваться на том, что тестировать, а не какими средствами на этот раз?! 🙂
Прошу простить за эмоциональность, никак не отпустит, о чудный гугль фрэймворк ^.^
Чем же этот инструмент так крут? Тем, что он обладает безграничными возможностями в пределах девайса:

  • Возможность тестирования на production прошивках, ни рутов, ничего не надо
  • Возможность кросс-программного тестирования (нереальный доселе сценарий: перед тестированием приложения скачать его из Google Play)
  • Возможность полностью контролировать все, что находится на экране
  • Очень простой и гибкий механизм выборки элементов экрана, похоже на Selenium/WatiN
  • Тесты просты в развертывании, установке и удалении
  • Работает реально быстро!
  • Интегрирован сразу с JUnit, все привычные assert-ы и вывод консоли присутствуют, можно даже не менять парсеры на CI серверах, просто сделать в новых тестах такой же вывод
  • Сразу добавлена возможность работы с девайсом на “хардовом уровне”: нажатие power кнопки, ху клики, свайпы и тд
  • Добавлена вспомогательная утилита: UIAutomatorView, которая упрощает поиск нужных элементов до истерического смеха счастья 🙂
  • Все для старта находится прямо в SDK и легко связывается с тестом

Из минусов было обнаружено следующее:

  • Нет связи с контекстом операционной системы (или я его еще не нашел) и как следствие, нет прямого и удобного пути для использования служебных сервисов, интентов, ресиверов и тд
  • Так же не нашел простого пути снятия скриншотов

В целом для UI тестирования эти минусы и не очень существенны, но все же хотелось бы иметь возможность прямого управления сервисами из теста (отключить wifi, взять wakelock, чтобы экран не блокировался и тд).
Очевидно, плюсов существенно больше 🙂

На закуску: маленький tutorial, как создать простой тест

Для простого примера выполним следующий сценарий: 1. Открыть Play Store 2. Найти Angry Birds Star Wars 3. Начать установку игры 4. Прервать закачку после 15 секунд (долго качается, для демо пропустим запуск после скачки, поверьте мне – запускается) 5. Выйти на Home Screen 7. Открыть уже установленную Angry Birds 8. Насладиться результатом 😀
Наглядный результат: https://www.dropbox.com/s/c5up1mqu8mfy0j1/VIDEO0067.mp4
Если руки чешутся испытать новую технологию в домашних условиях:

  • Установить все обновления SDK для Tools и миниум Api Level 16.
  • Если нет девайса с Android 4.1, то на эмуляторе заработало только для версии Android 4.2
  • Создать простой java module проект в любимой IDE (я использую идею)
  • Добавить в class path: android.jar из Android SDK из папки android-16
  • Не знаю почему, но у меня в SDK не оказалось uiautomator.jar, поэтому я добавил дополнительный content root в закладке Sources, в настройках проекта: /home/yahor/workspace/google/sdk/android-sdk-linux/sources/android-16/com/android/uiautomator
    update: чтобы появилась jar с автоматором, нужно сделать обновление до версии Android 4.2 в андроид менеджере, библиотека лежит здесь: /google/sdk/android-sdk-linux/platforms/android-16/uiautomator.jar
    Что приятно, UiAutomator поставляется полностью с открытым исходным кодом.
  • Волшебная команда, преобразует ваш java module проект в UiAutomator тест (в андроид доках баг – опущена команда create): ./android create uitest-project -n Demo -t 1 -p /home/yahor/workspace/bn/projects/nook/lcd/TestUIAutomator/ update: -t N, где N находится из android list targets, должно быть Android 4.1+Выполняется из папки SDK, где лежит сам android менеджер, парамет команды – это корневой каталог вашего теста
  • Волшебная команда для компиляции, инсталяции и запускации теста 🙂 Я сделал сарзу alias, очень удобно, запускать из корневого каталога теста: alias runtest=”ant build; adb push ./bin/Demo.jar /data/local/tmp/; adb shell uiautomator runtest Demo.jar -c com.test.uiautomatortest.AngryBirdsStarWarsDemo”

Собственно тестовый класс, для выше описанного сценария:
https://www.dropbox.com/s/of8v9vllxbyol6a/testClass.txt

Тестируйте и автматизируйте в удовольствие! (:
С уважением,
Егор