Автоматизированное тестирование мобильных приложений

Я провел настоящее исследование ситуации с автоматизированным тестированием интерфейса мобильных приложений. Речь идет не о тестировании модулей, а именно о тестировании интерфейса финального приложения. И, да, прямо на телефоне!

Зачем это нужно? В первую очередь, для гарантированного улучшения качества вашего ПО и улучшении настроения тестировщиков.

В чем идея? Чаще всего тестирование мобильных приложений осуществляется людьми: тестировщик берет приложение, iPhone 3, iPhone 4, iPad, если ему не повезло, то еще берет пару андроидов и GalaxyTab, и тестирует ваше приложение, 80% тестирования составляют примерно такие сценарии:
— запустить приложение, убедиться, что оно не падает;
— перейти на вкладку места, убедиться, что все пункты на месте;
— зайти в один из пунктов, убедиться, что описание на месте;


Такие тесты проводятся после каждого релиза и занимают очень много времени.

В свое время в вебе на помощь пришел Selenium, который позволил через специальный плагин к браузеру записывать действия тестировщика (все помнят макросы в MS Word?) и затем проигрывать их автоматически с проверкой результата. Можно запускать тесты даже на разных браузерах! Мы использовали это решение в своей компании, и оно, действительно, работает. Усилия на разработку тестов окупились.

По сравнению с вебом мобильная разработка еще очень молодая область, и я не ожидал увидеть хороших решений для автоматизированного тестирования интерфейсов. Оказалось, что их более чем достаточно. Хочу рассказать вам о некоторых из них.

iPhone

 

UIAutomation


Начну со стандартного решения от Apple, которое входит в Instruments. 


UIAutomation позволяет выполнять написанные на JavaScript тестовые сценарии как в эмуляторе, так и на устройстве. Тестировать можно любые свои приложения, включая, production сборки. Компилировать дополнительные библиотеки не требуется. Можно запускать скрипты из консоли.

Apple разработала специальный JavaScript API для тестирования. В нем описаны все стандартные элементы интерфейса. Элементы представлены деревом, есть специальные функции для быстрой выборки элементов по типам (buttons, tableViews, textFields...). Если специально не задавать в программном коде Accessibility Label, то элементы можно выбирать только по номеру. 

window.tableViews()[0].visibleCells()[1].tap()


Выбор второй ячейки в первой таблице.

Я написал тестовый скрипт для нашего Goozy приложения, он логинится, проверяет, что выбрана вкладка «All», переходит на вкладку «Settings» и разлогинивается.



На написание этого скрипта у меня ушел час, при этом рядом я держал открытый XCode и смотрел, как же представлены элементы в дизайнере, как они генерируются динамически. Ко всему прочему, скрипты пишутся в маленьком окне (на скришноте UIAutomation показан справа), проверки синтаксиса нет, поддержки систем контроля версий нет.

[Подсвеченный код: paste.ly/7mnG]

В сухом остатке: платформа мощная и правильная, но тестировщики вряд ли смогут писать тесты самостоятельно, при изменении внутренней стуктуры интерфейса тесты придется переписывать.

UPD: В Xcode 4.3 появилась возможность записи тестов. Запуск из консоли практически невозможен.

UPD2: При работе с UIAutomation строго рекомендуется задавать всем компонентам Accessibility Label

FoneMonkey


Record&Play решение, интересно тем, что тесты записываются и редактируются (!) прямо из тестируемого приложения на телефоне или эмуляторе.



Тем не менее, телефон должен быть подключен к компьютеру для сохранения тестов. И само собой, в приложении нужно компилировать несколько дополнительных библиотек.

Fonemonkey умеет сохранять тесты в формате UIAutomation, поэтому вы можете после записи прогонять их на «чистых» приложениях.

На мой взгляд, это единственное решение, которое тестировщики могут использовать самостоятельно. При одном условии, тесты будут запускать или разработчики, или они будут автоматически попадать в систему Continious Integration.

UPD: Экспорт в UIAutomation работает очень криво, мне не удалось запустить полученные скрипты.

Платные собратья

 

Squish


Squish — это решение для тестирования Windows, Mac, Qt и iOs приложений. Лицензия на конкретного разработчика стоит (named license) $2400. 



Система интегриуется в HP Quality Center, Seapine TCM или предоставляет Eclipse based IDE. Тестировать можно приложения на эмуляторе или устройстве, доступна запись тестов (record&play). Скрипты могут быть на Javascript, Python, Perl или Tcl.

У системы два минуса: для работы на устройстве (даже для прогона тестов) необходимо компилировать отдельную версию с их библиотекой; второй минус — это эклипс, если вы не разорились на HPQC, врядли, тестировщики смогут полноценно работать с eclipse-based IDE.

В целом, я не вижу принципиальных отличий от свободного FoneMonkey. Разве что, Squish поддерживает мультитач (support for automatic gestures).

JamoSolution


Одна из самых многообещающих платформ. JamoSolution позволяет тестировать iPhone, Android, Windows Mobile и BlackBerry приложения. При этом для всех платформ поддерживается запись тестов (record&play) и вы можете тестировать iPhone приложения на Windows!

У них есть прекрасные демонстрационные видео, вот тестирование под iPhone:


Под Android:


Очень радует возможность видеть экран телефона в IDE. JamoSolution работает через специального агента на телефоне, то есть ваши приложения останутся не модифицированными. Телефон может быть подключен проводом или по WiFi.

Android

 

Robotium


Самое популярное решение — это Robotium. «It's like Selenium, but for Android» — утверждают разработчики, но это немного не так. Robotium не поддерживает запись тестов (Record&Play) и не умеет делать скриншоты.



Тесты пишутся на Java, фактически, Robotium — это библиотека для обычных Unit тестов, возможности запускать тесты на устройстве нет (remote control). Чтобы тестировать приложения, необходимо их собрать с этой библиотекой. Возможно тестировать приложения без исходников, но процесс нетривиальный.

TestDroid


testdroid logo

Пока я проводил исследование, появилось новое решение для Android. TestDroid — это плагин для эклипса, который позволяет записывать тесты (record&play) в формате Robotium. Система взаимодейтсвует с телефоном путем стандартного Android debugger.

Одна лицензия на TestDroid Recorder стоит $600 в год. Разработчики обещают выпустить еще и TestDroid server, он позволит создавать кластеры для тестирования. Подключите к серверу несколько Android телефонов и запускайте тесты параллельно и удаленно.

К сожалению, решение еще в стадии бета-тестирования и не генерирует тесты на моем маке. 



К тому же, судя по логам, не все действия записываются в тесты. Решение многообещающее, но стоит немного подождать.

Windows Phone 7


На момент написания статьи утилит для автоматизации тестирования интерфейса WP7 приложений не существовало.

Absolute Black Box


Наверняка вам знакомо понятие «Черного ящика», так вот, есть как минимум две системы мобильного тестирования работающих по этому принципу.

Это Perfecto Mobile и Device Anywhere.

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



Внутрь фотографии телефона вставлена картинка с веб-камеры. Управляется полностью мышкой.

Основной бизнес Perfecto Mobile и Device Anywhere это даже не автоматическое тестирование, а продажа времени устройств. У них стоят сотни различных телефонов (iPhone/Android/Blackberry...) и час работы с одним телефоном стоит около $15.

Это очень удобное решение, если вы связаны с многими платформами и особенно с Android, под которые бывают десятки разных устройств. 

Но, к сожалению, когда я тестировал обе системы из России, все очень жутко тормозило, большой лаг при взаимодействии с телефоном. Тестировщики бы очень нервничали в таком режиме.

Где же автоматика?



Очень интересно реализовано автоматическое тестирование.

Проверка результатов выполняется сверкой картинок и распознаванием текста на экране OCR. Одна из платформ использует знаменитый ABBYY :-)

Кстати, тестирование доступно только для Enterprise клиентов и обсуждается каждый раз индивидуально, так что попробовать мне его не удалось.

Плюсы
  • Черный ящик — почти нет вмешательства в ваше приложение;
  • Один инструмент и тестовый скрипт для всех мобильных платформ;
  • Многообразие устройств;
  • Можно тестировать любые приложения: нативные, html5, мобильный сайты.
Минусы
  • автоматическое тестирование дорогое;
  • большой лаг при взаимодействии с телефоном.

Мне очень хочется подискутировать в комментариях. Кто разрабатывает мобильные приложения, ответьте, если не сложно, на несколько вопросов:

  1. Под какую платформу разрабатываете?
  2. Что за приложение? (игры, банковский сектор, бизнес приложения, медицина)
  3. Используете ли unit тесты, почему?
  4. Автоматизируете ли тестирование UI, почему?
  5. Если бы стали автоматизировать, какой инструмент был бы для вас идеален?

habrahabr.ru