Я провел настоящее исследование ситуации с автоматизированным тестированием интерфейса мобильных приложений. Речь идет не о тестировании модулей, а именно о тестировании интерфейса финального приложения. И, да, прямо на телефоне!
Зачем это нужно? В первую очередь, для гарантированного улучшения качества вашего ПО и улучшении настроения тестировщиков.
В чем идея? Чаще всего тестирование мобильных приложений осуществляется людьми: тестировщик берет приложение, iPhone 3, iPhone 4, iPad, если ему не повезло, то еще берет пару андроидов и GalaxyTab, и тестирует ваше приложение, 80% тестирования составляют примерно такие сценарии: — запустить приложение, убедиться, что оно не падает; — перейти на вкладку места, убедиться, что все пункты на месте; — зайти в один из пунктов, убедиться, что описание на месте; …
Такие тесты проводятся после каждого релиза и занимают очень много времени.
В свое время в вебе на помощь пришел Selenium, который позволил через специальный плагин к браузеру записывать действия тестировщика (все помнят макросы в MS Word?) и затем проигрывать их автоматически с проверкой результата. Можно запускать тесты даже на разных браузерах! Мы использовали это решение в своей компании, и оно, действительно, работает. Усилия на разработку тестов окупились.
По сравнению с вебом мобильная разработка еще очень молодая область, и я не ожидал увидеть хороших решений для автоматизированного тестирования интерфейсов. Оказалось, что их более чем достаточно. Хочу рассказать вам о некоторых из них.
iPhone
UIAutomation
Начну со стандартного решения от Apple, которое входит в Instruments.
UIAutomation позволяет выполнять написанные на JavaScript тестовые сценарии как в эмуляторе, так и на устройстве. Тестировать можно только приложения собранные в Debug-режиме и установленные с Development code-sign. Компилировать дополнительные библиотеки не требуется. Можно запускать скрипты из консоли.
Apple разработала специальный JavaScript API для тестирования. В нем описаны все стандартные элементы интерфейса. Элементы представлены деревом, есть специальные функции для быстрой выборки элементов по типам (buttons, tableViews, textFields...). Если специально не задавать в программном коде Accessibility Label, то элементы можно выбирать только по номеру.
window.tableViews()[0].visibleCells()[1].tap()
Выбор второй ячейки в первой таблице.
Я написал тестовый скрипт для нашего Goozy приложения, он логинится, проверяет, что выбрана вкладка «All», переходит на вкладку «Settings» и разлогинивается.
На написание этого скрипта у меня ушел час, при этом рядом я держал открытый XCode и смотрел, как же представлены элементы в дизайнере, как они генерируются динамически. Ко всему прочему, скрипты пишутся в маленьком окне (на скришноте UIAutomation показан справа), проверки синтаксиса нет, поддержки систем контроля версий нет.
В сухом остатке: платформа мощная и правильная, но тестировщики вряд ли смогут писать тесты самостоятельно, при изменении внутренней стуктуры интерфейса тесты придется переписывать.
FoneMonkey
Record&Play решение, интересно тем, что тесты записываются и редактируются (!) прямо из тестируемого приложения на телефоне или эмуляторе.
Тем не менее, телефон должен быть подключен к компьютеру для сохранения тестов. И само собой, в приложении нужно компилировать несколько дополнительных библиотек.
Fonemonkey умеет сохранять тесты в формате UIAutomation, поэтому вы можете после записи прогонять их на «чистых» приложениях.
На мой взгляд, это единственное решение, которое тестировщики могут использовать самостоятельно. При одном условии, тесты будут запускать или разработчики, или они будут автоматически попадать в систему Continious Integration.
Платные собратья
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
Пока я проводил исследование, появилось новое решение для Android. TestDroid — это плагин для эклипса, который позволяет записывать тесты (record&play) в формате Robotium. Система взаимодейтсвует с телефоном путем стандартного Android debugger.
Одна лицензия на TestDroid Recorder стоит $600 в год. Разработчики обещают выпустить еще и TestDroid server, он позволит создавать кластеры для тестирования. Подключите к серверу несколько Android телефонов и запускайте тесты параллельно и удаленно.
К сожалению, решение еще в стадии бета-тестирования и не генерирует тесты на моем маке.
К тому же, судя по логам, не все действия записываются в тесты. Решение многообещающее, но стоит немного подождать.
Windows Phone 7
На момент написания статьи утилит для автоматизации тестирования интерфейса WP7 приложений не существовало.
Absolute Black Box
Наверняка вам знакомо понятие «Черного ящика», так вот, есть как минимум две системы мобильного тестирования работающих по этому принципу.
Суть этих решений в том, что у них стоит ферма реальных мобильных телефонов, подключенных по кабелю, и веб-камера, передающая изображения с телефона. Выглядит это примерно так:
Внутрь фотографии телефона вставлена картинка с веб-камеры. Управляется полностью мышкой.
Основной бизнес Perfecto Mobile и Device Anywhere это даже не автоматическое тестирование, а продажа времени устройств. У них стоят сотни различных телефонов (iPhone/Android/Blackberry...) и час работы с одним телефоном стоит около $15.
Это очень удобное решение, если вы связаны с многими платформами и особенно с Android, под которые бывают десятки разных устройств.
Но, к сожалению, когда я тестировал обе системы из России, все очень жутко тормозило, большой лаг при взаимодействии с телефоном. Тестировщики бы очень нервничали в таком режиме.