Я 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
endcapabilities = {
‘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)
endafter :all do
@driver.quit
endit “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’)
Дополнительная информация:
Finding-and-interacting-with-elements
Примеры:
ОТЛАДКА
Я использую byebug for Ruby 2.0 для манипуляций с UI элементами.
Можно сделать вывод, что Appium очень полезен, особенно тем, что нет никакой необходимости внедрять код в тестируемое приложение.
С другой стороны, процесс подготовки к работе достаточно трудоемок. Поэтому, для быстрого старта, я подготовил простой gem: appium-rspec-bootstrap
Надеюсь, что вам он пригодится!
Перевод статьи iOS Integration Tests With Appium
Запишитесь прямо сейчас или закажите звонок с бесплатной консультацией!