Найти тему
AvitoTech

Emcee — тест-раннер для запуска автотестов на Android и iOS: как работает, и какие проблемы помогает решить

Оглавление

Привет, я Денис Веренцов, Android-инженер из команды, которая разрабатывает Emcee — инструмент Авито для параллельного запуска мобильных автотестов.

В этой статье я расскажу, как работает Emcee: как его развернуть, и как он помогает запускать нативные автотесты для мобильных приложений на примере Android. А ещё бонусом покажу, как работает облачная версия Emcee, которая позволяет прогонять тесты прямо в браузере, без необходимости своей инфраструктуры.

Я уже рассказывал про Emcee в видео-формате — можно посмотреть на YouTube-канале AvitoTech. Здесь — текстовая версия.

Какие сложности могут возникать с автотестами

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

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

Запускать тесты локально — долго. Например, у нас в Авито больше 4к автотестов на каждый пул-реквест. Прогон такого количества тестов на локальной машине займёт десятки часов.

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

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

Ещё примеры проблем:

  • Очереди при большом количестве пул-реквестов. Например, может возникнуть ситуация, когда для какого-то запуска тестов нужно уметь повышать приоритет, чтобы не ждать своей очереди.
  • Разные версии Android SDK. Например, нужно уметь между ними переключаться, когда тесты запускаются на разных версиях SDK.

Для решения этих сложностей мы и придумали Emcee.

Emcee — раннер для параллельного тестирования

Emcee — это раннер для параллельного запуска нативных автотестов для Android- и iOS-приложений. Он позволяет:

  • масштабировать количество тестов. Emcee сам распределяет тесты между машинами и предоставляет единый отчёт.
  • тестировать на своей инфраструктуре. Emcee можно самостоятельно развернуть на собственной инфраструктуре. Или вообще не тратить время на построение инфраструктуры, и тестировать в облаке (Emcee.cloud), но об этом чуть ниже.
  • автоматизировать процессы, чтобы быстрее узнавать об ошибках и посвящать больше времени разработке новой функциональности в продукте.

Первые 4 года мы использовали Emcee только для iOS, но теперь адаптировали систему и для запуска Android-тестов.

Как работает Emcee

Emcee состоит из трёх компонентов:

  1. Очередь — распределяет тесты по воркерам и централизованно возвращает результат клиентам.
  2. Воркеры — запускают тесты и эмуляторы, управляют ими и собирают результаты.
  3. Клиенты — отправляют тесты в очередь и принимают результат от очереди. Клиенты бывают двух типов: gradle-плагин и консольная утилита. Они взаимозаменяемы и применяются в зависимости от того, что удобнее пользователю.
Принцип работы Emcee
Принцип работы Emcee

Допустим, у нас есть пул-реквест с тестами. Сделали видео о том, как в этом случае работает Emcee. Кратко:

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

После запуска всех тестов результаты, статус запуска и артефакты возвращаются обратно клиентам.

Как запускать тесты в Emcee

Для демонстрации работы Emcee я создал и настроил небольшой демо-проект для Android, который включает в себя 11 разных тестов. Также я добавил инструмент Allure, чтобы посмотреть отчёт по окончании прогона.

Вот как выглядит настройка gradle-плагина в корневом build.gradle.kts файле:

-3

Подробнее про назначение параметров можно почитать в документации.

Найдём среди gradle-задач нужную и запустим прогон:

./gradlew emceeTestDefaultDebug

По окончании прогона видим в консоли, что не прошли 3 теста — так и задумано.

Emcee сообщает нам, какие тесты упали
Emcee сообщает нам, какие тесты упали

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

Давайте теперь заглянем в артефакты прогона. В Emcee они могут быть трёх видов: файлов для Allure-отчёта, логкатов по каждому тесту или видеозаписях экрана эмулятора.

Артефакты прогона тестов в Emcee
Артефакты прогона тестов в Emcee

Давайте посмотрим Allure-отчёт по тем файлам, которые скачал Emcee после прогона. В отчёте — подробная информация по всем тестам.

allure serve allure-results

Все 11 тестов в Allure-отчёте. 3 из них действительно упали
Все 11 тестов в Allure-отчёте. 3 из них действительно упали

Итак, мы успешно запустили тесты в Emcee на удалённой инфраструктуре и проверили, что тесты успешно запустились и по ним вернулись артефакты запуска.

Как развернуть Emcee на своей инфраструктуре

Для развёртывания Emcee на собственной инфраструктуре вам потребуются:

  • Linux-сервер;
  • KVM;
  • Docker,
  • Artifactory.

Artifactory нужен для передачи файлов внутри Emcee. Можно использовать либо уже существующую в вашей компании версию, либо развернуть open source версию рядом с Emcee.

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

Настраиваем. Я покажу простой пример с Docker Compose, в котором мы запустим очередь и 10 воркеров.

Для этого понадобится файл docker-compose.yml, в котором будут указаны докер-образы Emcee и файл с переменными окружения для конфигурации воркера.

-7

Ещё потребуется файл emcee-worker.env с переменными окружения для настройки воркеров. В нём достаточно указать всего два поля: адрес очереди и уровень логирования.

-8

Подробнее о дополнительных переменных окружения для воркеров можно почитать в документации.

Также перед запуском тестов необходимо настроить Artifactory. О том, как это сделать, можно почитать в документации.

Разворачиваем систему командой docker compose up -d

Ждём, пока развернутся все контейнеры
Ждём, пока развернутся все контейнеры

Теперь проверим, что воркеры подключились к очереди. Это можно сделать с помощью специального скрипта — он прочитает последние строки со всех воркеров.

-10

Каждый воркер поднял свой сервер
Каждый воркер поднял свой сервер

Воркеры успешно подключились к очереди и подняли каждый свой сервер. Это значит, что всё прошло успешно. Воркеры Emcee готовы принимать тесты.

В новой версии Emcee мы улучшили процесс старта воркера. Теперь при старте и готовности воркера можно увидеть сообщение "Worker is ready for work".

Как использовать Emcee в облаке

Emcee можно не разворачивать на своей инфраструктуре, как мы делали выше, а запускать тесты с помощью графического интерфейса в облаке. Для этого у нас есть сервис Emcee Cloud, он позволяет прогонять тесты на Android и iOS в браузере.

1. Загружаем APK-файлы: тесты и само приложение. Можно также выбрать тип раннера — я указал AndroidJUnitRunner. В новой версии облака раннер ищется автоматически.

Загружаем файлы в веб-интерфейсе Emcee Cloud
Загружаем файлы в веб-интерфейсе Emcee Cloud

2. Выбираем тесты из APK-файла, которые нужно прогнать.

Можно выбрать как все тесты, так и какие-то отдельные
Можно выбрать как все тесты, так и какие-то отдельные

3. Выбираем нужную версию Android SDK — сейчас доступно 6 версий. Также на этом экране можно добавить переменные окружения для тестов.

Доступно 6 версий Android SDK
Доступно 6 версий Android SDK

Когда всё готово, можно запускать прогон тестов. В интерфейсе вы увидите, что тесты были распределены по воркерам и начали выполняться. По мере их выполнения они будут отображаться в UI.

По каждому тесту можно посмотреть статус и детали запуска: время выполнения, исключения.

 Детальная информация по каждому тесту
Детальная информация по каждому тесту

Есть общий отчёт по прогону: сколько тестов прошло и сколько упало, как долго отрабатывали все тесты.

Общая информация о прогоне тестов
Общая информация о прогоне тестов

Из Emcee Cloud также можно выгрузить отчёт в формате Allure (если сам Allure есть в тестах) и Junit. А ещё можно запустить прогон на тех же файлах. Это может быть удобно, когда хочется запускать разные наборы тестов на одних и тех же файлах приложения.

Теперь вы знаете, какие проблемы можно решить с помощью Emcee и как быстро развернуть инфраструктуру для запуска автотестов.

Добавлю, что Emcee можно попробовать в разных вариациях уже сейчас:

  • on-premise,
  • cloud,
  • интеграция с Github Actions.

У нас в планах ещё много новых фичей и улучшений — следите за новостями в нашем TG-канале.

Полезные ссылки

Emcee

Автотесты в Авито