Привет, Хабр! Мы сотрудники Управления контроля качества одной из девелоперских компаний. Непосредственно участвуем в процессах тестирования программных продуктов, которые используются нашими менеджерами, работниками управляющих компаний, гостями и жителями ЖК.
Так как релизы наших приложений происходят почти еженедельно и нагрузка на ручных тестировщиков велика, в прошлом году мы внедрили автоматизацию регрессионных тестов. В этой статье расскажем о том, как мы настраивали запуск автотестов для мобильных устройств на реальном девайсе iOS.
Изначально такие автотесты писались и прогонялись на симуляторах, что довольно удобно: можно быстро собирать разные смартфоны и планшеты, проверять работоспособность приложения на различных версиях операционных систем и платформах. Тем не менее проверки должны быть максимально приближены к реальному пользовательскому сценарию взаимодействия с приложением, поскольку, в редких случаях могут возникать ошибки, которые не воспроизводятся на симуляторе. Поэтому, для получения более точных результатов тестирования было принято решение запускать автотесты на реальных устройствах. Со смартфоном Android все получилось быстро и безболезненно, но айфон заставил нас помучаться, этап подготовки показался долгим, сложным и запутанным.

1. Немного о нашем стеке технологий
Для автоматизации мы используем язык программирования Python и его фреймворк Pytest, взаимодействие с Веб частью реализовано при помощи Selenium, с мобильными приложениями – Appium. Мы пишем универсальные автотесты для проверки работы приложений и на Android и на IOs.
Итак, для запуска автотестов на реальном устройстве iOS понадобится:
Макбук, на который установлены Xcode, Appium и Appium Inspector.
Устройства iOS (у нас есть приложения, которые работают на iPhone, и которые работают только на iPad)
Тестируемое приложение (файл c расширением ipa).
Готовые автотесты для мобильных устройств.
2. Описание процессов настройки
Убеждаемся, что используем последнюю версию ОС на макбуке. Если это не так – обновляемся.
Убеждаемся, что используем последнюю версию XCode. Если это не так – обновляемся.
Убеждаемся, что используем последнюю версию ОС на нашем устройстве (Настройки => Основные => Обновление ПО)
Обновляем при необходимости версии Appium и драйвера XCUITest (вводим в терминале команды npm -g updateappium и appium driver update xcuitest)
На устройстве включаем режим разработчика (Настройки => Конфиденциальность и безопасность => Режим разработчика). Может потребоваться перезагрузка устройства. Когда режим разработчика включен, переходим в Настройки => Разработчик и включаем слайдер «Автоматизация интерфейса».
На устройстве переходим в Настройки => Приложения => Safari => Дополнения. Тут включаем слайдеры Веб-инспектор и Удаленная автоматизация.
На макбуке включаем консоль разработчика Safari (Safari => Настройки => Дополнения => Показывать функции для веб-разработчиков). Переходим во вкладку Разработка => Настройки для разработчиков и отмечаем чекбокс «Разрешить удаленную автоматизацию».
Заранее отключаем автоблокировку нашего смартфона чтобы больше на это не отвлекаться (он должен быть разблокирован для большинства дальнейших манипуляций)
Запускаем Xcode и подключаем наш iPhone к макбуку. Без переходников, оригинальным работающим проводом в проверенный порт. И макбук и смартфон запросят подтверждения стыковки, «разрешаем» коннект устройств во всплывающих окошках. Теперь наши устройства друг другу доверяют. Почти.
Устанавливаем тестируемое приложение на устройство. Переходим в Xcode => Window => Devices and Simulators и в открывшемся окне видим наше устройство. Добавляем ipa, нажав на плюс, убеждаемся, что приложение отображается в разделе Installed Apps.
На следующем этапе мы столкнулись с тем, что при попытке запуска приложения на реальном устройстве через Appium Inspector возникала ошибка с кодом 65. Выяснилось, что она связана с некорректным процессом XCode билда WebDriverAgent - серверной реализации WebDriver для iOS от компании Facebook.
-
Значит, пришло время разобраться с WebDriverAgent. Вводим в терминал appium driver run xcuitest open-wda – команда откроет соответствующий проект в Xcode. Выбираем Target => WebDriverAgentRunner, затем в самом верху выбираем наше устройство. Переходим во вкладку Signing and Capabilities и выбираем Team (имя владельца apple-id). Изменяем Bundle Identifier на другой, главное, чтобы он был уникальный, например заменив в его названии слово “facebook” на что-то еще. Если созданный Bundle Identifier устраивает Xcode, будет автоматически создан provisioningprofile. Если нет, придется пробовать другое имя. Этот этап придется повторять после каждого обновления Xcode или Xcuitest!
-
Теперь можно сбилдить наш WebDriverAgent на устройство. Проверяем данные: Product => Scheme => WebDriverAgentRunner. Product => Destination => Наше устройство. Product => Test.
-
На устройстве появилась иконка WDA, но смартфон не готов использовать приложение, установленное из Xcode, о чем свидетельствует уведомление на макбуке.
Поэтому переходим в Настройки => Основные => VPN и управление устройством. Подтверждаем здесь, что разработчику можно доверять, вводим пароль от устройства, если запросит.
Вводим в терминале команду appium или appium --allow-insecure chromedriver_autodownload в зависимости от того, в каком контексте собираемся подключаться к мобильному приложению нативном или гибридном.
Открываем Appium Inspector и создаем новый набор capabilities для подключения к реальному устройству. Например:
{ "platformName": "IOS",
"appium:deviceName": "Название устройства",
"appium:platformVersion": "18.2",
"appium:automationName": "XCUITest",
"appium:app": "bundle id приложения",
"appium:udid": "auto",
"appium:startIWDP": true,
"appium:xcodeSigningId": "iPhone Developer"}
Опишем параметры, которые могут быть не понятны:
"appium:app": "bundle id приложения"
– тот который присвоен нашему мобильному приложению, можно уточнить у разработчиков.
"appium:udid": "auto"
– Appium автоматически определит udid подключенного устройства, если по какой-то причине этого не происходит можно указать его напрямую. Посмотреть udid устройства можно в Xcode => Window => Devices and Simulators.
"appium:startIWDP": true
– позволяет при последующих запусках использовать установленный на устройстве WebDriverAgent без билда нового.

Запускаем сессию (устройство еще раз попросит ввести пароль для XCUItest) и ждем, пока открывшееся на устройстве тестируемое приложение отобразится в Appium Inspector. Это момент истины, потому что, если ранее что‑то было упущено, на этапе запуска сессии в Appium Inspector вы получите ошибку.
Итак, устройство и макбук подружились, приложение работоспособно, capabilities проверены: можно приступать к запуску автотестов.
Мы по‑прежнему пишем автотесты, используя симуляторы, потому что взаимодействие Appium Inspector с реальным устройством занимает больше времени и процесс написания кода увеличивается. Но регрессионные прогоны проводим на реальных девайсах, приближаясь к опыту пользователей наших приложений.
В отличие от интуитивно понятной настройки смартфона Android для автоматизации, многие моменты, предшествующие запуску автотестов на iPhone или iPad казались неочевидными. Подготовительных пунктов много, легко что‑то пропустить, да и первое взаимодействие с Xcode может сбить с толку. Надеемся, что наш гайд поможет настроить работу с реальным устройством iOS.
Недавно перед нами поставили новую задачу: создание генератора тестовых данных для наших ручных тестировщиков. Обещаем поделиться с читателями Хабра рассказом о процессе ее решения и достигнутых результатах.