Всем привет! Меня зовут Павел, я технический лидер тестирования в направления мобильной разработки. В моей прошлой статье я описывал, как мы разворачивали тестовый стенд для тестирования Android на базе Selenoid, и почему выбор пал именно на этот инструмент.
Следующим этапом нужно было развернуть аналогичный стенд для UI-тестирования iOS.
Здесь хотел бы отметить, что готового решения под яблочные девайсы нет, как для Android, так и в документации по Selenoid нет информации для iOS. Поэтому я опирался на статью Selenoid: Запускаем Appium UI-тесты на iOS. Часть 2. Однако, у нас была другая история, мы поднимали стенд для UI-тестирования на реальных iPhone.
Подготовка
Первое, что нам нужно сделать, это установить все необходимые пакеты и приложения.
Начнём с brew. С помощью этого приложения можно устанавливать пакеты, которые не предоставляет Apple. Идём на сайт или запускаем команду в терминале:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Далее устанавливаем npm-менеджер пакетов, входящий в состав Node.js. Для этого переходим на сайт, скачиваем файл для установки или в терминале выполняем команду:
brew install npm
Следующий шаг — установка Appium. Здесь без вариантов — устанавливаем через терминал:
sudo npm install -g appium
Также нам нужно установить appium-doctor, чтобы проверить в конце, что мы ничего не упустили при настройке Appium. Аналогично запускаем команду в терминале:
sudo npm install -g appium-doctor
Теперь на Mac нам нужно установить Сarthage. Также двумя способами: через установщик или терминал:
brew install carthage
И, наконец, открываем AppStore и ставим XCode.
А пока у нас качается и устанавливается приложение, мы можем перейти на сайт и скачать последнюю версию Selenoid для MacOS. Если у вас Intel, тогда нужна версия AMD для M1, M2 и т.д. Соответственно, нужна версия ARM.
Дальше переходим на сайт и по аналогии с Selenoid качаем последнюю версию Selenoid UI.
Подготовка закончена — можно переходить к настройке.
Настройка
Сначала нам нужно добиться, чтобы при запуске appium-doctor не было ошибок. Сперва устанавливаем Xcode Command Line Tools.
Команда в терминале:
xcode-select --install
После установки проверяем:
xcode-select -p
В терминале должны увидеть такую строку:
/Applications/Xcode.app/Contents/Developer
Запускаем appium-doctor:
appium-doctor --ios
После чего должны увидеть примерно такое:
Appium настроен, теперь можно переходить к настройке конфигурации. Создаем конфиг для Appium и конфиг для Selenoid:
{
"ios": {
"default": "iPhone X",
"versions": {
"iPhone X": {
"image": ["appium", "--config", "/Users/mobilefarm.am/selenoid/config/appium/iphonex.json"]
},
"iPhone 6s": {
"image": ["appium", "--config", "/Users/mobilefarm.am/selenoid/config/appium/iphone6s.json"]
}
}
}
}
Запускаем Selenoid со следующими параметрами:
./selenoid -disable-docker -conf config/browsers.json -limit 20 -retry-count 1000 -video-output-dir video -log-output-dir logs -max-timeout 20m -session-attempt-timeout 15m -timeout 10m -service-startup-timeout 10m
И Selenoid UI:
./selenoid-ui --selenoid-uri=http://localhost:4444
Проверяем, что Selenoid успешно запустился:
http://localhost:8080
В браузере должна открыться стандартная UI:
Переходим к самому интересному...
Установка драйвера на девайсах
Самая проблематична часть в настройке тестового стенда. Открываем терминал и запускаем команду:
appium driver run xcuitest open-wda
Должен открыться проект WebDriverAgent.
Нужно перейти в Xcode → Preferences → Accounts и добавить учетную запись AppleID. После чего:
вернуться к проекту;
в разделе Signing & Capabilities выбрать свой ранее добавленный аккаунт в поле Team;
и заменить в поле Bundle Identifier на свое значение.
Запустить сборку и после проверить Product → Test. На девайсе должна появиться иконка драйвера.
На iPhone переходим в Настройки → Основные → Профили и Управление устройством и нажимаем Доверять разработчику.
Возможные проблемы и решение
При попытке подключиться через Appium Inspector столкнулись с такой ошибкой:
Закрываем XCode и качаем с сайта zip-файл последней версии. Распаковываем архив и закидываем содержимое архива в директорию ~/.appium/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent/
, предварительно очистив эту папку.
Теперь запускаем проект wda и повторно собираем драйвер для девайса. Опять закрываем XCode, переустанавливаем проект.
sudo appium driver uninstall xcuitest
sudo appium driver install xcuitest
Открываем проект и ещё раз собираем драйвера на iPhone — пробуем подключиться через Appium Inspector. У нас после таких манипуляций подключение прошло успешно и запустился Safari на девайсах.
На этом всё. Далее мы планируем настроить Go GGR Router, чтобы у нас была единая точка подключения. Спасибо за внимание.
house2008
День добрый. Очень интересно
но ничего не понятно. А почему просто через fastlane не запускать тесты на реальном девайсе (рассмотрим кейс когда одна машина как у вас на скрине один макбук чтобы не учитывать распиливание тестов на несколько машин) ?pbezpal Автор
Интересное предложение, но я не изучал и не прорабатывал решение с fastlane. Да и каких-то преимуществ по сравнению с selenoid я не вижу. Нужно также поднимать и настраивать окружение, судя по документации к fatlane. Плюс мы хотели получить единую точку подключения через ggr-router.
house2008
Просто для iOS разработки fastlane является общим стандартом по сборке/публикации/тестам приложения(й), и я предположил, что вы столкнулись с его ограничениями для ваших задач и хотел узнать подробности. Спасибо.
pbezpal Автор
Можете подсветить моменты, которые непонятны в статье по настройке тестового окружения для iOS?)
house2008
Стыдно признать, но ни слова в статье не понял )
Думаю, лучше объяснить на сравнении с нашим подходом.
У нас есть CI Gitlab и есть Mac mini (там стоят все нужные версии Xcode) на котором запускаются задачи с гитлаба на различные эвенты. Например, у нас в Gitlab на создание мерж реквеста создается задача для запуска UI тестов на Mac mini. Описание задачи выглядит следующим образом (gitlab-ci.yml):
что означает, что на создание МР скачивается репозиторий нашего приложения на Mac mini и запускается баш скрипт который в свою очередь запускает fastlane.
Fastlane логика лежит в папке /fastlane в корне проекта и там описана вся логика, что нужно сделать. Команда:
означает запустить lane с именем ui_tests в файле /fastlane/Fastfile, который и запустит наши UI тесты. Сам lane пускатель тестов выглядит в базовой версии примерно так:
В целом это всё, делаем фичу в своей ветке, потом в основную ветку создаем МР и запускается каскад различных тестов, в том числе и UI тесты.
пс. может быть у вас не нативные приложения, а в webview где нужны свои специальные UI тесты (никогда не сталкивался с web разработкой).