Я Ruby on Rails-разработчик. Как и другие RoR-разработчики, я люблю автоматизированные тесты. Наибольшее предпочтение я отдаю acceptance-тестам с использованием Capybara. С момента, когда я перешел на iOS-разработку, для меня остро встал вопрос использования инструмента для легкого и удобного написания приемочных тестов, как Apple’s UI Automation, Calabash или Appium. Последний из них оказался фреймворком для создания тестов как для iOS, так и для Android, а также гибридных приложений. Appium поддерживает множество языков, в том числе и Ruby.
Мой выбор пал на этот фреймворк первым для изучения и я начал использовать его для написания тестов для моего текущего проекта. Давайте посмотрим, насколько хорош Appium для нашей задачи.
Для начала, нам нужны 3 вещи:
- Сервер Appium
- Наше приложение
- Тестовые сценарии
УСТАНОВКА APPIUM
Сущетвует 2 вида установки Appium: скачать архив с приложением и установка через npm. Первая попытка установить через npm оказалось неудачной, поэтому я решил просто скачать готовый архив. Однако мне удалось установить Appium из терминала после полной переустановки Node и после того, как я вручную очистил папку /usr/local/share/npm.
1 2 |
$: sudo npm install -g appium $: appium |
СБОРКА ПРОЕКТА
Ниже приведен простой скрипт для сборки приложения и перемещения его в отдельную папку для быстрого доступа.
1 2 3 4 5 6 7 |
xcodebuild -sdk iphonesimulator6.0 \ -workspace /Users/mishyn/workspace/rw/project-ios/Project.xcworkspace \ -scheme Project \ ONLY_ACTIVE_ARCH=NO \ TARGETED_DEVICE_FAMILY=1 \ DEPLOYMENT_LOCATION=YES \ DSTROOT=`pwd`/app |
Не забудьте поставить «Shared» в «Manage Schemes» проекта, иначе вы можете наткнуться на следующую ошибку:
1 2 |
ld: library not found for -lPods clang: error: linker command failed with exit pre 1 (use -v to see invocation) |
ПИШЕМ СЦЕНАРИЙ ТЕСТА
Вот небольшой шаблон, нам необходимо его дополнить своими сценариями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
def absolute_app_path file = File.join(File.dirname(__FILE__), 'app/Applications/Project.app') raise "App doesn't exist #{file}" unless File.exist? file file end capabilities = { 'browserName' => 'iOS', 'platform' => 'Mac', 'version' => '6.0', 'app' => absolute_app_path } server_url = "http://127.0.0.1:4723/wd/hub" describe "Computation" do before :all do @driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => server_url) end after :all do @driver.quit end it "should open search" do @driver.find_elements(:tag_name, '*') end end |
ПОИСК ЭЛЕМЕНТОВ
Selenium обращается с элементами приожения точно так же, как и с HTML DOM:
1 |
@driver.find_elements(:tag_name, 'collectionCell') |
Угадайте, как найти элемент tableCell? Правильно:
1 |
@driver.find_elements(:tag_name, 'tableCell') |
Чтобы найти все элементы:
1 2 |
@driver.find_elements(:tag_name, '*').map(&:tag_name) # => |
Найти все видимые кнопки:
1 |
@driver.find_elements(:tag_name, 'button').select(&:displayed?).map(&:text) |
Выглядит неплохо.
Для клика по кнопке с названием «Done», вы можете сделать следующее:
1 |
@driver.find_element(:name, 'Done').click |
В реальной жизни, зачастую, в приложении может быть использовано множество кнопок-картинок, чтобы обратиться к элементу по его имени, мы можем использовать accessibilityIdentifier.
Например, iOS разработчик прописал для кнопки accessibilityIdentifier со значением «Done», тогда в тесте это будет выглядеть:
1 |
find_element(:name, 'Done') |
Дополнительная информация:
Finding-and-interacting-with-elements
Примеры:
ОТЛАДКА
Я использую byebug for Ruby 2.0 для манипуляций с UI элементами.
Можно сделать вывод, что Appium очень полезен, особенно тем, что нет никакой необходимости внедрять код в тестируемое приложение.
С другой стороны, процесс подготовки к работе достаточно трудоемок. Поэтому, для быстрого старта, я подготовил простой gem: appium-rspec-bootstrap
Надеюсь, что вам он пригодится!
Перевод статьи iOS Integration Tests With Appium
Запишитесь прямо сейчас или закажите звонок с бесплатной консультацией!
Записаться сейчас / Бесплатная консультация