Обновление Проекта Android С Помощью Github Actions. Часть 2



Запуск тестов пользовательского интерфейса на GitHub Actions Продолжаем разбираться с автоматизацией Android-проекта на GitHub Actions, в этой части:

  • Давайте создадим новый проект для UI-тестов в Firebase Test Lab.
  • Настроим интеграцию GitHub Actions и Test Lab.
  • Давайте посмотрим, как можно запускать тесты пользовательского интерфейса в рабочем процессе на CI/CD.
Если вы пропустили первую часть истории, где мы разбирались с модульными тестами в Android-проекте, вы можете начать с этого.

Для запуска модульных тестов нам нужно только настроить среду Java. Все тесты выполняются внутри JVM очень быстро, все просто, и возможность появления ненадежных тестов практически исключена.

Такие тесты должны составлять 70-80% от общего количества тестов в проекте.

Во-первых Вместе с ними стоит рассмотреть бизнес-логику.

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

С UI-тестами все сложно с самого начала.

Во-первых, их нужно написать.

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

Затем, когда критическая масса UI-тестов написана, нужно придумать, как запустить это богатство и поддерживать его в рабочем состоянии в условиях постоянных A/B-тестов и частых изменений интерфейса.

Вам нужно решить, где они будут запускаться — реальные устройства или эмуляторы и кто будет владеть этими устройствами — собственная телефонная ферма или использовать сторонние сервисы.

В общем, тема непростая.

Мы пойдем по самому простому и удобному пути – Тестовая лаборатория Firebase Firebase Test Lab — сервис от Google, который предоставляет возможность запускать тесты на реальных устройствах или в эмуляторах.

На момент написания бесплатный план предлагает 10 тестов в день на эмуляторах и 5 на реальных устройствах.

В платном тарифе цена теперь составляет 1 доллар за телефон-час эмулятора, и за такое удобство можно заплатить.

Весь процесс запуска тестов в Test Lab можно описать следующими шагами:

  1. Делаем проверку на нужном коммите и устанавливаем среду Java
  2. Мы проводим модульное тестирование.

    Если на этом этапе возникает ошибка, то нет смысла тратить время на UI-тестирование.

  3. Собираем артефакты для UI-тестирования с помощью специальных Gradle-задач.

  4. Скачиваем APK-артефакты, которые собираемся отправить на тестирование.

  5. Войдите в Firebase Test Lab, используя личный токен.

  6. Использование специальной утилиты командной строки gcloud , мы передаем ранее собранные APK-файлы в Test Lab.
  7. Мы ждем прохождения тестов и смотрим на результаты в рабочем процессе GitHub Actions.
Но сначала давайте создадим проект приложения на Firebase и сгенерируем для себя токен для доступа к нему из GitHub. Пойдем https://console.firebase.google.com и войдите в свою учетную запись Google. Затем следуйте инструкциям мастера очистки и нажмите «Создать проект».



Обновление проекта Android с помощью GitHub Actions. Часть 2

Укажите имя

Обновление проекта Android с помощью GitHub Actions. Часть 2

Затем отключаем Google Analytics или оставляем все как есть; это никак не повлияет на Test Lab. Если вам нужна аналитика, выйдите и примите условия пользовательского соглашения на следующем шаге.



Обновление проекта Android с помощью GitHub Actions. Часть 2

Когда проект создан, мы начинаем генерировать токен для доступа GitHub Actions к Test Lab. Перейдите в «Настройки проекта», затем на вкладку «Сервисные учетные записи».

Там выбираем «Управление разрешениями сервисной учетной записи».



Обновление проекта Android с помощью GitHub Actions. Часть 2

Теперь нам нужно добавить сервисную учетную запись с правами, которые мы планируем использовать на CI/CD, в GitHub Actions. Для запуска UI-тестов вам нужны только права «Редактора».

Подробнее здесь .



Обновление проекта Android с помощью GitHub Actions. Часть 2

Заполните предложенные поля

Обновление проекта Android с помощью GitHub Actions. Часть 2

Выберите тип «Редактор».

Если вы неправильно настроите права доступа для сервисного аккаунта, то на этапе авторизации в Firebase мы получим ошибку 403.

  
  
  
  
  
  
  
  
   

ERROR: (gcloud.firebase.test.android.run) Unable to access the test environment catalog: ResponseError 403: Not authorized for project ***



Обновление проекта Android с помощью GitHub Actions. Часть 2

На третьем шаге вы можете просто нажать кнопку «Готово».

Мы только что добавили сервисную учетную запись для CI/CD и теперь готовы получить токен.

Выберите «Создать ключ».



Обновление проекта Android с помощью GitHub Actions. Часть 2

Выбираем из двух предложенных вариантов JSON, после чего он будет автоматически скачан.

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

Он содержит различную служебную информацию о вашей учетной записи и проекте, а также приватный_ключ.

Хитрость в том, что использовать JSON в таком виде мы не сможем.

Вам придется закодировать его через Base64. Есть два способа: 1) В консоли вводим

base64 github-actions-sample-key.json > base64-key.txt

Где github-actions-sample-key.json — это имя JSON, загруженного на предыдущем шаге, а base64-key — файл, в который будет записан результат кодирования.

2) Делаем все на https://www.base64encode.org/ Возвращаем проект на GitHub и записываем результат в Секреты проекта на GitHub.

Обновление проекта Android с помощью GitHub Actions. Часть 2

После добавления ключа в секреты обязательно удалите или переместите ключ с помощью Firebase и base64-key в безопасное место.

Теперь вам нужно добавить идентификатор проекта к секретам на экране общих настроек проекта в Firebase. Не путайте это с номером проекта.



Обновление проекта Android с помощью GitHub Actions. Часть 2

Отлично, вы готовы интегрировать GitHub Actions и Test Lab. Создайте новый рабочий процесс в каталоге github/workflows. Если мы запустим рабочий процесс прямо сейчас, мы получим ошибку при запуске тестов пользовательского интерфейса в Test Lab.

ERROR: (gcloud.firebase.test.android.run) User [github-actions-ci-cd@***.

iam.gserviceaccount.com] does not have permission to access project [***:initializeSettings] (or it may not exist): Cloud Tool Results API has not been used in project 254361894337 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/toolresults.googleapis.com/overviewЭproject=254361894337 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Собственно, можно перейти по ссылке из ошибки и включить API toolresults.googleapis.com , но теперь давайте посмотрим, как можно управлять любым API в вашем проекте.

Нажмите «Включить API и службы».



Обновление проекта Android с помощью GitHub Actions. Часть 2

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

Найдите API результатов Cloud Tool и включите его.

Ну вот теперь точно все, пора запускать рабочий процесс.



name: UI_tests_on_release on: pull_request: branches: - 'main' jobs: assemble_ui_test_artifacts: if: startsWith(github.head_ref, 'release/') == true name: Build artifacts runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: {java-version: 1.8} - name: Build APK for UI test after Unit tests run: | .

/gradlew test .

/gradlew assembleDebug .

/gradlew assembleDebugAndroidTest - name: Upload app-debug APK uses: actions/upload-artifact@v2 with: name: app-debug path: app/build/outputs/apk/debug/app-debug.apk - name: Upload app-debug-androidTest APK uses: actions/upload-artifact@v2 with: name: app-debug-androidTest path: app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk run_ui_tests_on_firebase: runs-on: ubuntu-20.04 needs: assemble_ui_test_artifacts steps: - uses: actions/checkout@v2 - name: Download app-debug APK uses: actions/download-artifact@v1 with: name: app-debug - name: Download app-debug-androidTest APK uses: actions/download-artifact@v1 with: name: app-debug-androidTest - name: Firebase auth with gcloud uses: google-github-actions/setup-gcloud@master with: version: '290.0.1' service_account_key: ${{ secrets.FIREBASE_KEY }} project_id: ${{ secrets.FIREBASE_PROJECT_ID }} - name: Run Instrumentation Tests in Firebase Test Lab run: | gcloud firebase test android models list gcloud firebase test android run --type instrumentation --use-orchestrator --app app-debug/app-debug.apk --test app-debug-androidTest/app-debug-androidTest.apk --device model=Pixel2,version=28,locale=en,orientation=portrait

Давайте разберемся, что здесь происходит Шаг 1

name: UI_tests_on_release on: pull_request: branches: - 'main' jobs: assemble_ui_test_artifacts: if: startsWith(github.head_ref, 'release/') == true name: Build artifacts runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: {java-version: 1.8}

Здесь точно такие же настройки для запуска рабочего процесса, как и раньше.

Запрос на включение в основную ветку из ветки, имя которой начинается с Release/.

Далее мы извлекаем и устанавливаем среду Java 8. Шаг 2

- name: Build APK for UI test after Unit tests run: | .

/gradlew test .

/gradlew assembleDebug .

/gradlew assembleDebugAndroidTest - name: Upload app-debug APK uses: actions/upload-artifact@v2 with: name: app-debug path: app/build/outputs/apk/debug/app-debug.apk - name: Upload app-debug-androidTest APK uses: actions/upload-artifact@v2 with: name: app-debug-androidTest path: app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

На этом этапе мы запускаем модульные тесты, а затем собираем два APK — app-debug.apk и app-debug-androidTest.apk. Почему два? Да, только один APK — это собственно приложение для тестирования, а второй APK содержит инструментальные тесты, нам понадобятся оба.

Далее мы извлекаем полученные артефакты по пути и имени в файле upload-artifact@v2. все это у нас уже есть сделано раньше , когда мы готовили APK к выпуску, поэтому не будем вдаваться в подробности.

Шаг 3

run_ui_tests_on_firebase: runs-on: ubuntu-20.04 needs: assemble_ui_test_artifacts steps: - uses: actions/checkout@v2 - name: Download app-debug APK uses: actions/download-artifact@v1 with: name: app-debug - name: Download app-debug-androidTest APK uses: actions/download-artifact@v1 with: name: app-debug-androidTest

Второе задание в рабочем процессе тестирования не запускается параллельно с первым (assemble_ui_test_artifacts), а ждет его успешного завершения.

Это указано в строке.



needs: assemble_ui_test_artifacts

Далее воспользуемся готовым действием download-artifact@v1 и получим по названию два APK, которые мы собрали в последнем задании.

Шаг 4 Мы подошли к самому интересному — пора передать артефакты в Тестовую Лабораторию для тестирования.



- name: Firebase auth with gcloud uses: google-github-actions/setup-gcloud@master with: version: '290.0.1' service_account_key: ${{ secrets.FIREBASE_KEY }} project_id: ${{ secrets.FIREBASE_PROJECT_ID }} - name: Run Instrumentation Tests in Firebase Test Lab run: | gcloud firebase test android models list gcloud firebase test android run --type instrumentation --use-orchestrator --app app-debug/app-debug.apk --test app-debug-androidTest/app-debug-androidTest.apk --device model=Pixel2,version=28,locale=en,orientation=portrait

Сначала выполняем действие setup-gcloud, передавая в качестве аргументов идентификатор проекта и тот самый ключ Base64, который хранится в секретах, все по инструкции .

Дальше просто выполняем команды в консоли.

Первый Список моделей Android для тестирования gcloud Firebase отобразит таблицу доступных устройств с названиями и версиями SDK. Для тестирования этого не требуется, просто удобно посмотреть и выбрать подходящее устройство.

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

Полный список ключей всегда можно найти в документация .

Давайте запустим рабочий процесс и посмотрим, что произойдет.

Обновление проекта Android с помощью GitHub Actions. Часть 2

Отлично, всё работает, реализован самый базовый сценарий запуска UI-тестов! Подробные результаты тестирования можно посмотреть на вкладке «Тестовая лаборатория» проекта.

Либо можно убрать из секретов Project ID (иначе ссылка будет содержать звездочки вместо ID) и переходить к результатам прямо из логов.



Обновление проекта Android с помощью GitHub Actions. Часть 2

Что еще можно улучшить в сценарии? Вы можете включить оркестратор, добавив ключ --use-оркестратор.

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

--num-flaky-test-attempts - установить количество попыток перезапуска для нестабильных тестов.

--network-профиль - для установки профиля сети во время тестирования.

Например, вы можете протестировать медленное соединение.

Полный список ключей с описаниями здесь: https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run Вы также можете включить шардинг для запуска тестов.

https://firebase.google.com/docs/test-lab/android/instrumentation-test#sharding https://github.com/Flank/flank Идея для самообучения, если вам интересно что-то посмотреть прямо сейчас: 1) Попробуйте запустить UI-тесты не в Test Lab, а в эмуляторе, работающем на MacOS. Ты можешь видеть https://github.com/ReactiveCircus/android-emulator-runner 2) Настройте матрицу тестирования для UI-тестов.

Запускайте тесты не на одной версии Android SDK, а на каждом из условий, указанных в условиях.

Вот и все, что касается запуска UI-тестов из GitHub Actions :) Теги: #Android #Разработка Android #github #it-инфраструктура #DevOps #тестирование #tutorial #ci/cd #разработка Android #тестирование пользовательского интерфейса #Действия Github #юнит-тестирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.