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

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

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

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

24190cc61f6034612974b620a5455393.jpeg

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

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

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

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

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

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

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

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

  • Разные версии 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 файле:  

emcee { 
	// адрес очереди Emcee
	queueBaseUrl.set("http://speed-mobile-releases:41000")
	testTimeout.set(Duration.ofMinutes(1))
	// настройки для Artifactory
	artifactory { 
		user.set("")
		password.set("")
		baseUrl.set("http://speed-mobile-releases:8082/artifactory/")
		repository.set("emcee-transport")
	}
	// другие параметры
	job {
		groupId.set("Emcee Android Demo")
		groupPriority.set(1)
		id.set("")
		priority.set(1)
	}
	retries.set(1)
	loggerConfiguration {
		logLevel.set("debug")
		printStackTrace.set(false)
	}
      devices {
            addDevice(31, "default")
      }
}
...

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

Найдём среди 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 и файл с переменными окружения для конфигурации воркера.

version: "3.9"

services:
  emcee-queue-service:
    image: avitotech/emcee-queue:20.0.0
    container_name: emcee-queue-service
    ports:
      - 41000:41000

  queue-worker:
    image: avitotech/emcee-worker:20.0.0
    env_file:
      - emcee-worker.env
    depends_on:
      - emcee-queue-service
    deploy:
      replicas: 10
    devices:
      - "/dev/kvm:/dev/kvm"

  emcee-artifactory:
    image: docker.bintray.io/jfrog/artifactory-oss:latest
    container_name: emcee-artifactory
    ports:
      - 8081:8081
      - 8082:8082
    volumes:
      - emcee_artifactory:/var/opt/jfrog/artifactory
volumes:
  emcee_artifactory:

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

EMCEE_WORKER_QUEUE_URL=http://emcee-queue-service:41000
EMCEE_WORKER_LOG_LEVEL=info

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

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

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

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

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

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

docker ps -aq -f name=queue-worker | xargs -I{} docker logs --tail=1 {}

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

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

Воркеры успешно подключились к очереди и подняли каждый свой сервер. Это значит, что всё прошло успешно. Воркеры 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 можно попробовать в разных вариациях уже сейчас:

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

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

Emcee

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

© Habrahabr.ru