В этом сообщении блога описывается, как готовить, создавать и запускать приложения iOS в AWS Device Farm.

Статья предназначена для мобильных инженеров и QE и предоставляет документацию по решению, которое должно облегчить нашу жизнь, если возникнет необходимость повторить его в будущем.

История наших проблем

У нас есть приложение, которое измеряет выполнение запланированных задач на различных мобильных устройствах. Нам нужно иметь возможность запускать наше приложение на как можно большем количестве физических устройств и в любое время. Приложение должно иметь возможность входить в нашу систему и взаимодействовать с ней.

Из-за требований к физическим устройствам мы искали платформу с большим разнообразием физических устройств и способом запуска приложения. К счастью, поиск был прост. Существует множество подобных сервисов, таких как AWS Device Farm, Google Firebase Labs, Azure DevLabs, Sauce Labs и другие. Другой вариант - построить нашу мобильную ферму, но это отвлечет наше внимание от нашей основной цели. AWS Device Farm - это сервис, обеспечивающий управляемый доступ ко многим физическим мобильным устройствам и веб-браузерам для тестирования. Для нас важно то, что нет необходимости поддерживать эти устройства или браузеры. Он прост в использовании, в нем есть необходимые нам устройства, и мы уже используем другие сервисы в AWS; Таким образом, мы остановились на AWS Device Farm.

Другой нашей задачей было определить, как передавать учетные данные на мобильные устройства, работающие в облаке. Простые решения, такие как использование переменных среды в контейнере Docker, неприменимы, поскольку мобильные устройства не могут запускать контейнеры Docker. Кроме того, мы хотели избежать компиляции учетных данных непосредственно в приложении. Таким образом, мы искали решение, как передавать значения из командной строки при запуске теста.

Подготовка приложения

В следующих абзацах описаны шаги, необходимые для создания простого пользовательского интерфейса iOS XCTest. Не стесняйтесь пропустить эту часть, если у вас уже есть тест, который вы хотите запустить. AWS Device Farm не поддерживает аргументы запуска; Таким образом, наша самая большая проблема с тестом пользовательского интерфейса iOS заключалась в передаче значений для тестирования из командной строки без повторной компиляции теста.

Создание нового теста пользовательского интерфейса

  1. В XCode переключитесь на «Тестовый навигатор»

2. Нажмите кнопку «+» в левом нижнем углу и выберите «Новая цель теста пользовательского интерфейса».

3. Дайте вашей тестовой мишени любое имя. Стандартное соглашение <app-name>UITest

Настройка передачи значений из командной строки

  1. Создайте TextField / TextView в StoryBoard / SwiftUI. Вновь созданное представление должно быть видимым и доступным для фокусировки, чтобы оно было видимым для теста XCUI.
  2. Добавьте идентификаторы доступности в новые поля.
  3. Перейти к настройке схемы приложения ›Тест› Аргументы ›Переменные среды› Добавить новую переменную со значением по умолчанию

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

Сборка файлов IPA для AWS

Этот шаг предполагает, что у вас есть рабочая подпись для вашего приложения. Необходимо предоставить файл IPA приложения и проверить файл IPA. Я покажу, как создавать файлы IPA через пользовательский интерфейс, а также из командной строки.

Классический стиль пользовательского интерфейса

  1. В Xcode выберите целевое устройство «Generic iOS Device».
  2. Затем нажмите Продукт - ›Архив.
  3. Дождитесь завершения сборки, выберите архив и нажмите «Распространить приложение». Следующие шаги показаны на изображениях ниже.

Действия, необходимые для экспорта локального файла IPA

4. После экспорта файлов IPA вы можете закрыть список архивов.

5. Нажмите Продукт - ›Создать для тестирования.

6. Создайте папку /tmp/Payload. Любая папка по вашему выбору может заменить папку / tmp /: mkdir -p ‘/tmp/Payload’

7. Перейдите в папку «Производные данные». Вы можете получить путь в настройках «Xcode -› Настройки - ›Местоположения».

8. В папке «Производные данные» перейдите в «ваше-приложение» - ›Сборка -› Продукты - ›Debug / Result-iphoneos.

9. Скопируйте папку *UITests-Runner.app во вновь созданную папку Payload.

10. Заархивируйте папку Payload и переименуйте заархивированную папку в uitests.ipa.

Настоятельно рекомендуется: командная строка

Просто используйте следующий код, чтобы выполнить все указанные выше действия вручную:

Создание проекта в AWS Device Farm

В этом разделе описывается, как создать проект в AWS Device Farm и настроить его для запуска. Мы используем браузер, чтобы вручную завершить настройку ниже, но я настоятельно рекомендую вам проверить Документацию Boto3 для Device Farm, чтобы узнать, как автоматизировать то, что я собираюсь показать.

Сначала войдите в AWS в своем браузере, затем перейдите в раздел «Device Farm» и нажмите «Создать новый проект». Следующим шагом является предоставление «имени проекта», поэтому введите все, что вы предпочитаете, и нажмите «Создать проект».

Я бы посоветовал перейти в «Настройки проекта» и оптимизировать «Тайм-аут выполнения» после создания проекта. Я считаю, что для начального тестирования значения 5 минут должно быть более чем достаточно. Я рекомендую создать что-то вроде «Tiny Device Pool» для начальной настройки тестирования.

Конфигурация запуска

Здесь мы настраиваем запуск на самом устройстве, и результат настройки запланирован для запуска в выбранном вами пуле устройств.

1. Перейдите в свой проект и нажмите «Выполнить».

2. Выберите мобильную платформу (Android и Apple) и загрузите файл IPA, созданный на шаге выше «Создание файлов IPA для AWS». Дождитесь завершения загрузки и анализа и нажмите «Далее».

3. Вы должны увидеть экран «Настроить тест». Выберите «Тест» в качестве XCTest UI. Загрузите UItest.ipa из шага «Создание файлов IPA для AWS » и дождитесь завершения загрузки и анализа.

4. Измените выбор «Выберите среду выполнения» на «Запустить тест в настраиваемой среде». Это дает вам возможность выбрать «Default TestSpec для iOS XCTest UI» или другой, который вам больше нравится, и позволяет вам нажать «Изменить».

5. Добавьте следующую строку в «pre_test: commands:».

pre_test:
  commands:
  - /usr/libexec/PlistBuddy -c “add :<your UI test target>:EnvironmentVariables:PIN string ‘<pin value>’” $DEVICEFARM_XCUITESTRUN_FILE

6. Дополнительные шаги: Если вы не уверены в текущем содержании $DEVICEFARM_XCUITESTRUN_FILE, тогда add:-cat $DEVICEFARM_XCUITESTRUN_FILE. Другой вариант заключается в том, что вы можете удалить добавленные значения из файла запуска, выполнив команду удаления ниже:

post_test:
  commands:
  — /usr/libexec/PlistBuddy -c “delete :<your UI test target>:EnvironmentVariables:PIN’” $DEVICEFARM_XCUITESTRUN_FILE

7. После внесения изменений нажмите «Сохранить как новый» или «Сохранить» в зависимости от того, редактируете ли вы стандартное значение или свой TestSpec.

8. На следующем шаге выберите новый пул устройств. После этого вы можете настроить что угодно для своего приложения на следующем экране «Укажите состояние устройства» и нажмите «Далее».

9. Одна из последних настроек - указать ожидаемое время для вашего теста. Сделав это, нажмите «Подтвердить и начать работу».

Последние слова

Если вы обнаружите, что в статье чего-то не хватает или у вас есть вопросы по поводу более подробной информации, оставьте комментарий. Это сообщение в блоге представляет собой отфильтрованный и отсортированный набор информации, который мы нашли на различных форумах, в официальной документации и на нашем собственном опыте. Я хочу сказать большое спасибо Крису Исмаэлю, Якубу Снору, Роберту Риду и Зденеку Папезу за их помогите с обзором статьи.