Интегрируйте тестовую лабораторию в вашу систему CI/CD

1. Введение

Последнее обновление: 07.04.2022

Как запускать мобильные тесты с помощью систем CI/CD

Проведение тестирования мобильных приложений может быть сложной задачей: многие приложения работают на разных платформах, устройствах и версиях API. Разработчики приложений стремятся тестировать приложения на как можно большем количестве конфигураций, чтобы выявлять проблемы до того, как их обнаружат пользователи. Однако ограничения по стоимости и ресурсам ограничивают количество тестовых устройств и объем ручного обслуживания, который могут себе позволить отдельные разработчики. Когда процесс разработки масштабируется, особенно для систем непрерывной интеграции/непрерывной разработки (CI/CD), процесс тестирования необходимо автоматизировать, минимизируя при этом затраты и трудозатраты на обслуживание.

Чтобы помочь вам понять, как ваши приложения работают на устройствах пользователей, Firebase Test Lab размещает в своих центрах обработки данных множество физических и виртуальных мобильных устройств. Мы также предоставляем Google Cloud CLI — независимый от платформы инструмент командной строки, который позволяет запускать тесты на устройствах в наших центрах обработки данных. GCloud CLI упрощает интеграцию облачного решения Test Lab для тестирования в существующие рабочие процессы CI/CD.

Кроссплатформенная поддержка

Test Lab предоставляет решения для тестирования приложений Android и iOS, а также специализированную поддержку для мобильных игр, таких как Unity. Варианты тестирования охватывают популярные фреймворки, такие как Android Espresso, UI Automator и iOS XCTest. Используя наш автоматизированный веб-краулер Robo , Test Lab может запускать тесты даже без написания тестового кода.

Никаких аппаратных требований

Test Lab размещает физические устройства в центрах обработки данных Google, а виртуальные — в облаке Google. Все, что вам нужно сделать, это отправить свои тесты в Test Lab и дождаться результатов.

Быстро и надежно

Запуск множества одновременных тестовых случаев может занять много времени, блокируя процессы CI/CD. С помощью Test Lab вы можете легко разделить тесты и запускать их на нескольких устройствах параллельно. Вы также можете выявлять нестабильность, распространенную проблему мобильного тестирования.

Что вы узнаете

  • Как создавать тестовые артефакты
  • Как запустить тестирование мобильного приложения с помощью CLI gcloud.
  • Как настроить Jenkins CI
  • Как запускать мобильные тесты с помощью Jenkins CI
  • Как настроить тесты для масштабируемости с помощью систем непрерывной интеграции (CI).

Данный практический урок посвящен запуску тестов. Несущественные понятия и блоки кода опущены и предоставлены для простого копирования и вставки.

Что вам понадобится

Если вы предпочитаете разрабатывать всё с нуля, вам понадобится Android Studio для запуска тестов Android или XCode для запуска тестов iOS. Или же вы можете просто прийти и всё подготовить самостоятельно, а мы предоставим необходимые компоненты.

2. Проведите тест с помощью интерфейса командной строки gcloud.

Создайте APK-файл Android-приложения и протестируйте его.

Для запуска тестов с помощью Test Lab начните с создания APK-файла Android-приложения и тестового APK-файла, содержащего инструментированные тесты для запуска на аппаратных устройствах или эмуляторах. Если у вас уже есть работающий код, вы можете создать собственные APK-файлы или использовать BasicSample для Espresso .

Для сборки APK-файлов с помощью команд Gradle необходимо установить Android SDK. Если Android Studio не установлена ​​на вашем компьютере, установите Android Studio и Android SDK , а также установите переменную среды ANDROID_HOME указав в ней каталог вашего Android SDK. Например, в файл ~/.bash_profile добавьте следующую строку:

export ANDROID_HOME=~/Android/Sdk # For linux
export ANDROID_HOME=~/Library/Android/sdk  # For MacOS

Затем выполните следующие команды, чтобы клонировать код и собрать APK-файлы:

git clone https://github.com/android/testing-samples.git
cd testing-samples/ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

После выполнения команд клонирования и сборки вы найдете APK-файл приложения и тестовый APK-файл в следующих местах:

app/build/outputs/apk/debug/app-debug.apk
app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

В качестве альтернативы вы можете использовать следующие варианты для получения APK-файлов для тестирования и приложений:

Если у вас есть рабочий исходный код iOS-приложения, вы можете написать XCTest и создать ZIP-файл из приложения и тестов.

Используйте интерфейс командной строки gcloud для запуска тестов с помощью Test Lab.

В этом разделе вы создадите проект Firebase и настроите локальную среду Google Cloud SDK. Для получения дополнительной информации см. раздел «Начало тестирования с помощью CLI gcloud» .

Настройте интерфейс командной строки gcloud.

  1. Загрузите Google Cloud SDK , который включает в себя инструмент командной строки gcloud.
  2. Убедитесь, что ваша установка обновлена ​​до последней версии:
gcloud components update
  1. Войдите в интерфейс командной строки gcloud, используя свою учетную запись Google:
gcloud auth login
  1. Укажите свой проект Firebase в CLI gcloud, где PROJECT_ID — это идентификатор вашего проекта Firebase. Идентификатор проекта можно найти в URL-адресе консоли Firebase, который соответствует следующему соглашению об именовании: https://console.firebase.google.com/project/[PROJECT_ID]/...
gcloud config set project PROJECT_ID

Если у вас нет проекта Firebase, создайте его в консоли Firebase .

Проведите тестирование, используя собранные APK-файлы.

В этом разделе вы запускаете инструментальный тест на устройстве по умолчанию в Test Lab — Pixel 3 с уровнем API 28. Если вы хотите использовать другое устройство, проверьте список доступных устройств .

Используя APK-файлы приложения и тестовые APK-файлы, созданные вами в разделе «Создание APK-файла для Android-приложения и тестового APK-файла», запустите инструментальный тест Android с помощью следующей команды:

gcloud firebase test android run \
  --type instrumentation \
  --app app/build/outputs/apk/debug/app-debug.apk \
  --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

Проанализируйте результаты теста.

Вы можете проанализировать результаты теста, используя любой из следующих вариантов:

  • gcloud summary — после завершения теста интерфейс командной строки gcloud выводит краткое резюме результатов теста.
  • Код завершения gcloud — после завершения теста команда завершается с кодом 0, если тест пройден успешно. Если тест не пройден, команда завершается с ненулевым кодом завершения.
  • Консоль Firebase — CLI gcloud выводит ссылку на консоль Firebase. Ссылка соответствует соглашению об именовании https://console.firebase.google.com/project/PROJECT_ID/testlab/... Для получения дополнительной информации см. раздел «Интерпретация результатов одного выполнения теста» .
  • XML-файл JUnit — CLI gcloud выводит следующее:
Raw results will be stored in your Cloud Storage bucket at [https://console.developers.google.com/storage/browser/test-lab-xxxxx/xxxxx/]

test-lab-xxxxx/xxxxx — это сегмент Cloud Storage, в котором хранятся тестовые артефакты и результаты. Чтобы найти XML-файл JUnit, содержащий результаты тестирования, откройте ссылку и перейдите по адресу blueline-28-en-portrait/test_result_1.xml .

3. Настройка Jenkins CI

В этом разделе вы используете Jenkins CI, популярную систему непрерывной интеграции, для запуска тестов с помощью Test Lab. Если вы хотите использовать другую систему непрерывной интеграции, см. раздел «Расширенные рекомендации по запуску больших наборов тестов» и документацию по другим системам непрерывной интеграции, таким как Bitrise и Circle CI . В качестве альтернативы gcloud CLI можно использовать Flank .

Включите интерфейс командной строки gcloud для Jenkins.

Прежде чем использовать Test Lab с Jenkins, необходимо включить необходимые API и настроить учетную запись службы, которую Jenkins сможет использовать для аутентификации с помощью CLI gcloud.

Добавьте учетную запись службы Google Cloud для Jenkins.

Сервисные учетные записи — это ограниченные учетные записи, предназначенные для интеграции сервисов. Эти учетные записи обеспечивают детальный контроль над конкретными сервисами и не подлежат проверке на спам или запросам капчи, которые в противном случае могли бы блокировать ваши сборки CI.

Для создания служебной учетной записи выполните следующие действия:

  1. Откройте страницу «Учетные записи служб» в консоли Google Cloud.
  2. Нажмите «Создать учетную запись службы» , добавьте имя и описание , а затем нажмите «Создать и продолжить» .
  3. В раскрывающемся списке «Выберите роль» выберите «Базовая» , а затем — «Редактор» .
  4. Нажмите «Продолжить» , затем нажмите «Готово» .

Далее необходимо создать и загрузить ключ аутентификации, который Jenkins сможет использовать для аутентификации в качестве созданной вами учетной записи службы.

Для создания и загрузки ключа учетной записи службы выполните следующие действия:

  1. На странице «Учетные записи служб» в консоли Google Cloud щелкните адрес электронной почты, связанный с созданной вами учетной записью.
  2. Выберите «Клавиши» , затем нажмите «Добавить клавишу» и «Создать новую клавишу» .
  3. Выберите JSON , затем нажмите «Создать» .
  4. Когда появится запрос на загрузку файла, нажмите ОК. Загрузите файл в безопасное место на вашем компьютере. Этот файл понадобится вам позже при настройке Jenkins.

Чтобы узнать больше о создании учетных записей служб, см. раздел «Создание учетной записи службы» .

Включите необходимые API Google Cloud.

API облачного тестирования позволяет запускать тесты на инфраструктуре Google. Вы активировали этот API после завершения запуска теста с помощью CLI gcloud. API результатов облачных инструментов позволяет программно получать доступ к результатам ваших тестов.

  1. Откройте библиотеку API в консоли разработчиков Google .
  2. В строке поиска в верхней части консоли Firebase введите название каждого необходимого API ( Cloud Testing API и Cloud Tool Results API ). Откроется страница с обзором запрошенного API.
  3. На странице обзора каждого API нажмите кнопку «Включить API» .

Установите и настройте Jenkins.

Вы можете установить и настроить Jenkins CI на Linux, macOS, Windows и многих других средах. Некоторые детали этого практического занятия касаются именно установки и запуска Jenkins CI на Linux, включая использование косых черт (/) в путях к файлам.

Чтобы загрузить и установить Jenkins на компьютер под управлением Linux или Windows, следуйте инструкциям по установке Jenkins . После установки Jenkins выполните те же инструкции по установке, чтобы завершить настройку и получить доступ к панели управления Jenkins по адресу http://localhost:8080 .

Проверьте установленные плагины.

Jenkins поддерживает различные системы контроля версий. В этом практическом задании вы используете Git для выполнения предыдущего теста. А для более удобного использования интерфейса командной строки gCloud вам необходимо установить плагин GCloud SDK.

  1. На панели управления Jenkins нажмите «Управление Jenkins» , а затем — «Управление плагинами» .
  2. Найдите плагины Git и GCloud SDK и установите их (если они еще не установлены).

Настройте расположение ваших SDK для Android и Google Cloud.

Теперь вам нужно указать Jenkins, где найти Google Cloud SDK и Android SDK.

Для настройки Google Cloud и Android SDK для Jenkins выполните следующие действия:

  1. На панели управления Jenkins нажмите «Управление Jenkins» , а затем — «Глобальная конфигурация инструментов» .
  2. В разделе Google Cloud SDK нажмите «Добавить Google Cloud SDK» .
  3. В поле «Имя» введите легко запоминающееся имя для экземпляра Google Cloud SDK, например, GCloud-SDK.
  4. Перейдите в домашний каталог Google Cloud SDK, например, /opt/google-cloud-sdk .
  5. Нажмите « Сохранить ».
  6. Настройте общесистемные свойства для Android и Google Cloud SDK, открыв Панель управления > Управление Jenkins > Настройка системы .
  7. Установите флажок «Переменные среды» и нажмите «Добавить» .
  8. В поле «Имя» введите ANDROID_HOME . В поле «Значение» укажите расположение вашего Android SDK, например, /opt/Android/Sdk .
  9. Установите флажок «Расположение инструментов» и нажмите «Добавить» . В раскрывающемся списке «Имя» выберите имя экземпляра Google Cloud SDK, который вы добавили в разделе «Глобальная конфигурация инструментов».
  10. В поле «Главная» укажите расположение вашего Google Cloud SDK, например, /opt/google-cloud-sdk .
  11. Нажмите « Сохранить ».

Добавьте учетные данные своей служебной учетной записи в Jenkins.

Теперь добавьте учетные данные своей учетной записи службы gcloud CLI в Jenkins, чтобы Jenkins мог аутентифицироваться и успешно выполнять команды gcloud CLI.

  1. На панели управления Jenkins нажмите «Управление Jenkins» , а затем — «Управление учетными данными» .
  2. В разделе «Хранилища, относящиеся к Jenkins» щелкните ссылку на (глобальный) домен, а затем нажмите «Добавить учетные данные» .
  3. В раскрывающемся списке «Тип» выберите «Учетная запись службы Google из закрытого ключа» .
  4. В поле «Название проекта» введите название вашего проекта Firebase.
  5. Выберите ключ JSON , затем нажмите «Обзор» и перейдите к месту, где вы сохранили ключ своей учетной записи службы.
  6. Нажмите «Создать» .

Теперь вы готовы настроить автоматическую сборку Jenkins для тестовой лаборатории.

4. Запустите тесты Test Lab с помощью Jenkins CI.

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

Вы можете настроить Jenkins для автоматической сборки и запуска тестов каждый раз, когда вносятся обновления в ваше приложение. Вы также можете настроить Jenkins для периодического запуска сборок. Подробнее о настройке сборок в Jenkins см. в разделе «Настройка автоматических сборок» .

Создайте и настройте свой проект Jenkins.

Создайте проект для запуска непрерывного интеграционного тестирования вашего приложения с помощью Test Lab.

Создайте проект Jenkins

  1. Откройте панель управления Jenkins, перейдя по адресу http://localhost:8080 .
  2. На панели управления Jenkins нажмите «Создать элемент» .
  3. Введите название для вашего проекта в поле «Название элемента» и нажмите «Проект произвольного стиля» , чтобы создать проект, использующий единую конфигурацию сборки.
  4. Нажмите ОК . Для завершения настройки проекта выполните оставшиеся разделы в указанной последовательности.

Настройка управления исходным кодом

  1. На вкладке «Управление исходным кодом» выберите Git .
  2. В поле "URL репозитория" введите https://github.com/android/testing-samples.git .

Настройте среду сборки.

В разделе «Среда сборки» можно настроить характеристики сборки. Чтобы включить аутентификацию Google Cloud, выполните следующие действия:

  1. На вкладке «Среда сборки» установите флажок аутентификации GCloud SDK и выберите имя установки, которое вы указали при добавлении информации об установке Google Cloud.
  2. В раскрывающемся списке «Учетные данные Google» выберите учетные данные сервисной учетной записи, которые вы настроили.

Добавьте шаги сборки Gradle для пересборки пакетов APK.

  1. Прокрутите вниз до раздела «Сборка» , нажмите «Добавить шаг сборки» , а затем выберите «Выполнить оболочку» .
  2. Добавьте этап сборки, который будет выполнять следующие команды в основном каталоге вашего приложения:
cd ui/espresso/BasicSample/
./gradlew assembleDebug  # for generating app apk
./gradlew assembleDebugAndroidTest # for generating testing apk

Добавьте шаг сборки с использованием gcloud CLI в Jenkins.

Теперь вы готовы добавить шаг сборки в Jenkins для запуска тестовой лаборатории с помощью командной строки gcloud CLI.

Чтобы добавить шаг сборки с использованием CLI gcloud, добавьте новый шаг сборки «Выполнить команду оболочки» и введите следующую команду:

gcloud config set project PROJECT_ID
gcloud firebase test android run \
--app ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/debug/app-debug.apk
--test ${WORKSPACE}/ui/espresso/BasicSample/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

После завершения настройки проекта прокрутите страницу вниз и сохраните конфигурацию. Вы будете перенаправлены на главную страницу нового проекта.

Запуск тестов с помощью Jenkins

Теперь вы готовы собрать проект Jenkins и запустить тест, подобный тому, который вы запускали вручную с помощью CLI gcloud.

Для запуска тестов с помощью Jenkins выполните следующие действия:

  1. Чтобы запустить сборку вручную, нажмите кнопку «Собрать сейчас» .
  2. Чтобы проверить ход выполнения и результаты, нажмите на кнопку «Новая сборка» > «Вывод в консоль» .

Если ошибок не обнаружено, поздравляем! Вы только что создали проект и запустили тест на устройстве Pixel 2 одним щелчком мыши. Если возникнут ошибки, см. раздел «Устранение неполадок» .

5. Передовые методы запуска больших наборов тестов.

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

Расширение охвата для различных конфигураций устройств.

Вы можете легко добавить несколько устройств на этап сборки gcloud CLI. Также вы можете проверить и выбрать доступные устройства, версии, языковые настройки и ориентации экрана. Например, следующая команда запускает тесты на двух устройствах:

  • Виртуальный Google Pixel 2 с API уровня 30 в портретной ориентации и английской локализацией.
  • Физический Samsung Galaxy S20 с API уровня 29 в альбомной ориентации и французской локализацией.
gcloud firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --device model=Pixel2,version=30,locale=en,orientation=portrait  \
  --device model=x1q,version=29,locale=fr,orientation=landscape

Используйте конфигурационный файл YAML для CLI gcloud.

Если вы предпочитаете управлять аргументами в одном месте или с помощью системы контроля версий, вы можете указать эти аргументы в файле аргументов в формате YAML. Чтобы узнать, как использовать эту функцию, запустите команду gcloud topic arg-files .

Параллельное выполнение шардовых тестов

Разделение тестов на подгруппы (шарды) позволяет разбить набор тестов на подгруппы (шарды), которые выполняются отдельно и изолированно. Test Lab автоматически запускает каждый шард параллельно, используя несколько устройств, что позволяет Test Lab быстрее завершить весь набор тестов. Для получения дополнительной информации см. раздел «Включение разделения тестов на подгруппы» .

Чтобы включить сегментирование, используйте gcloud beta и добавьте флаг –num-uniform-shards или –test-targets-for-shard к шагу сборки CLI gcloud. Например, чтобы разделить ваши тесты на пять выполнений и запустить их параллельно, выполните следующие команды:

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-uniform-shards 5

Включить обнаружение нестабильности

Тестирование мобильных приложений часто бывает нестабильным. Иногда тесты проходят успешно, а иногда могут завершиться неудачей, даже при одинаковых настройках. Определить, был ли неудачный тест нестабильным, можно с помощью флага командной строки gcloud –num-flaky-test-attempts . Этот флаг указывает количество повторных попыток выполнения теста, если один или несколько тестовых случаев завершились неудачей по какой-либо причине.

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

gcloud beta firebase test android run \
  --type instrumentation \
  --app app-debug.apk \
  --test app-debug-test.apk \
  --num-flaky-test-attempts 3

6. Поздравляем!

Поздравляем, вы успешно провели свой первый тест в тестовой лаборатории с использованием системы непрерывной интеграции!

Вы создали APK-файлы приложения и тестовые файлы, а также запустили инструментальное тестирование с помощью Test Lab, используя CLI gcloud. Кроме того, вы настроили проект Jenkins для автоматизации этого же тестирования.

Теперь вы знаете основные шаги по интеграции Test Lab в вашу систему CI/CD.

Что дальше?

Ознакомьтесь с инструкцией по настройке CI с помощью Firebase Emulator Suite.

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

Справочная документация