Автоматизация тестирования iOS приложений с использованием Appium

Я 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.

$: sudo npm install -g appium
$: appium

СБОРКА ПРОЕКТА

Ниже приведен простой скрипт для сборки приложения и перемещения его в отдельную папку для быстрого доступа.

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” проекта, иначе вы можете наткнуться на следующую ошибку:
ld: library not found for -lPods
clang: error: linker command failed with exit pre 1 (use -v to see invocation)

ПИШЕМ СЦЕНАРИЙ ТЕСТА

Вот небольшой шаблон, нам необходимо его дополнить своими сценариями.

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:

@driver.find_elements(:tag_name, ‘collectionCell’)

Угадайте, как найти элемент tableCell? Правильно:

@driver.find_elements(:tag_name, ‘tableCell’)

Чтобы найти все элементы:

@driver.find_elements(:tag_name, ‘*’).map(&:tag_name)
# =>

Найти все видимые кнопки:

@driver.find_elements(:tag_name, ‘button’).select(&:displayed?).map(&:text)

Выглядит неплохо.

Для клика по кнопке с названием “Done”, вы можете сделать следующее:

@driver.find_element(:name, ‘Done’).click

В реальной жизни, зачастую, в приложении может быть использовано множество кнопок-картинок, чтобы обратиться к элементу по его имени, мы можем использовать accessibilityIdentifier.

Например, iOS разработчик прописал для кнопки accessibilityIdentifier со значением “Done”, тогда в тесте это будет выглядеть:

find_element(:name, ‘Done’)

Дополнительная информация:

Github Wiki

Finding-and-interacting-with-elements

Примеры:

examples/ruby/u_i_catalog.rb

ОТЛАДКА

Я использую byebug for Ruby 2.0 для манипуляций с UI элементами.

Можно сделать вывод, что Appium очень полезен, особенно тем, что нет никакой необходимости внедрять код в тестируемое приложение.
С другой стороны, процесс подготовки к работе достаточно трудоемок. Поэтому, для быстрого старта, я подготовил простой gem: appium-rspec-bootstrap

Надеюсь, что вам он пригодится!

Перевод статьи  iOS Integration Tests With Appium

Запишитесь прямо сейчас или закажите звонок с бесплатной консультацией!

Записаться сейчас / Бесплатная консультация

Ваше имя (обязательно)

Ваш телефон (обязательно). В формате +375XXXXXXXXX