Запуск тестов пользовательского интерфейса на GitHub Actions Продолжаем разбираться с автоматизацией Android-проекта на GitHub Actions, в этой части:
- Давайте создадим новый проект для UI-тестов в Firebase Test Lab.
- Настроим интеграцию GitHub Actions и Test Lab.
- Давайте посмотрим, как можно запускать тесты пользовательского интерфейса в рабочем процессе на CI/CD.
Для запуска модульных тестов нам нужно только настроить среду Java. Все тесты выполняются внутри JVM очень быстро, все просто, и возможность появления ненадежных тестов практически исключена.
Такие тесты должны составлять 70-80% от общего количества тестов в проекте.
Во-первых Вместе с ними стоит рассмотреть бизнес-логику.
Но иногда хочется большего — тестов, которые будут моделировать действия реальных пользователей и сравнивать ожидания с реальностью.
С UI-тестами все сложно с самого начала.
Во-первых, их нужно написать.
Звучит банально, но уже на этом этапе большинство людей теряют энтузиазм.
Затем, когда критическая масса UI-тестов написана, нужно придумать, как запустить это богатство и поддерживать его в рабочем состоянии в условиях постоянных A/B-тестов и частых изменений интерфейса.
Вам нужно решить, где они будут запускаться — реальные устройства или эмуляторы и кто будет владеть этими устройствами — собственная телефонная ферма или использовать сторонние сервисы.
В общем, тема непростая.
Мы пойдем по самому простому и удобному пути – Тестовая лаборатория Firebase Firebase Test Lab — сервис от Google, который предоставляет возможность запускать тесты на реальных устройствах или в эмуляторах.
На момент написания бесплатный план предлагает 10 тестов в день на эмуляторах и 5 на реальных устройствах.
В платном тарифе цена теперь составляет 1 доллар за телефон-час эмулятора, и за такое удобство можно заплатить.
Весь процесс запуска тестов в Test Lab можно описать следующими шагами:
- Делаем проверку на нужном коммите и устанавливаем среду Java
- Мы проводим модульное тестирование.
Если на этом этапе возникает ошибка, то нет смысла тратить время на UI-тестирование.
- Собираем артефакты для UI-тестирования с помощью специальных Gradle-задач.
- Скачиваем APK-артефакты, которые собираемся отправить на тестирование.
- Войдите в Firebase Test Lab, используя личный токен.
- Использование специальной утилиты командной строки gcloud , мы передаем ранее собранные APK-файлы в Test Lab.
- Мы ждем прохождения тестов и смотрим на результаты в рабочем процессе GitHub Actions.
Укажите имя
Затем отключаем Google Analytics или оставляем все как есть; это никак не повлияет на Test Lab. Если вам нужна аналитика, выйдите и примите условия пользовательского соглашения на следующем шаге.
Когда проект создан, мы начинаем генерировать токен для доступа GitHub Actions к Test Lab. Перейдите в «Настройки проекта», затем на вкладку «Сервисные учетные записи».
Там выбираем «Управление разрешениями сервисной учетной записи».
Теперь нам нужно добавить сервисную учетную запись с правами, которые мы планируем использовать на CI/CD, в GitHub Actions. Для запуска UI-тестов вам нужны только права «Редактора».
Подробнее здесь .
Заполните предложенные поля
Выберите тип «Редактор».
Если вы неправильно настроите права доступа для сервисного аккаунта, то на этапе авторизации в Firebase мы получим ошибку 403.
ERROR: (gcloud.firebase.test.android.run) Unable to access the test environment catalog: ResponseError 403: Not authorized for project ***
На третьем шаге вы можете просто нажать кнопку «Готово».
Мы только что добавили сервисную учетную запись для CI/CD и теперь готовы получить токен.
Выберите «Создать ключ».
Выбираем из двух предложенных вариантов 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.
После добавления ключа в секреты обязательно удалите или переместите ключ с помощью Firebase и base64-key в безопасное место.
Теперь вам нужно добавить идентификатор проекта к секретам на экране общих настроек проекта в Firebase. Не путайте это с номером проекта.
Отлично, вы готовы интегрировать 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 и службы».
Здесь вы можете управлять 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. Для тестирования этого не требуется, просто удобно посмотреть и выбрать подходящее устройство.
Дальше начинается непосредственно тестирование, в командных клавишах передаем выбранный код устройства, локаль, ориентацию экрана телефона и так далее.
Полный список ключей всегда можно найти в документация .
Давайте запустим рабочий процесс и посмотрим, что произойдет.
Отлично, всё работает, реализован самый базовый сценарий запуска UI-тестов! Подробные результаты тестирования можно посмотреть на вкладке «Тестовая лаборатория» проекта.
Либо можно убрать из секретов Project ID (иначе ссылка будет содержать звездочки вместо ID) и переходить к результатам прямо из логов.
Что еще можно улучшить в сценарии? Вы можете включить оркестратор, добавив ключ --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 #юнит-тестирование
-
Узнайте, Как Сделать Обратные Ссылки
19 Oct, 24 -
Развлекайтесь С Бесплатными Онлайн-Играми
19 Oct, 24 -
Это Презентация
19 Oct, 24 -
Хостинг Одностраничного Сайта
19 Oct, 24 -
Как Manychat Перешел На Php8
19 Oct, 24 -
Почему Компания Меня Потеряла?
19 Oct, 24