Сложности с автотестами
На крупных проектах в коммерческой разработке может быть больше 5000 тестов:
- unit (юниты);
- component UI (компонентные);
- E2E (End to End).
Они занимают разное количество времени. Например, на прогон unit нужна приблизительно 1 секунда. E2E самый «тяжелый»: он проходит за минуту и больше.
Прогон 2000–5000 тестов может занять 24 часа и более. Не у всех есть столько времени на тестирование приложений, особенно если у команды крупный проект с еженедельными релизами.
Сами же проекты целесообразно хранить на отечественных платформах — например, GitVerse. В экосистеме продуктов разработчика доступна GIGA IDE Desktop для Java, Kotlin и других языков программирования. Писать код, генерировать документацию и тесты помогает AI-ассистент GIGA CODE. Он поддерживает более 35 языков программирования и доступен для большинства IDEs: VS Code, PyCharm, CLion, WebStorm, phpStorm и иных.
Где запускать тесты?
В разработке есть два классических способа запустить тесты:
- Локально. У отдельного тестировщика на рабочем устройстве (например, MacBook Air) может просто не хватать ресурсов. Выход из ситуации — или вторая / третья машина, или простой.
- На удаленных машинах. В этом случае появляются вопросы организации инфраструктуры. Программистам приходится решать ряд дополнительных задач: как управлять устройствами (реальными или эмуляторами), как будут поднимать и как останавливать девайсы.
В случае работы с удаленными машинами возникает и еще одна проблема. На каждый запуск автотеста выделяется равномерный пул устройств. Если девайс справляется с задачей раньше, дальше он будет простаивать, хотя мог бы взять еще что-нибудь в работу (это влияет на общий срок тестирования). Кроме того, возникают проблемы очередей и параллельного запуска.
Решить их помогает инструмент Emcee. Сначала он был доступен на iOS-устройствах, а затем разработчики представили решения для Android. Также доступен Appium для тестирования на разных платформах.
Что такое Emcee?
Представьте, что редактору проекта приходит задача от клиента: написать 30 текстов. Если делать это в одиночку, срок сдачи растянется на несколько недель. Редактор будет загружен и не сможет брать другие задачи. Логичное решение — распределить тексты между 3–5 авторами (воркерами), которые будут работать параллельно. Когда автор сдает статью, он тут же получает задание на новую.
Задача редактора сводится к тому, чтобы распределить задачи между воркерами и собрать результаты, а при необходимости — отправить текст на доработку текущему автору или передать задачу другому. Emcee работает приблизительно так же. Только в роли редактора выступает Очередь (Queue), а в роли авторов — Воркеры (Workers). Клиенту остается выдать задачу (т.е. тест) и принять результат.
Emcee — это платформа для параллельного прогона автотестов на мобильных устройствах. Инструмент поставляется в облачной версии и On-Prem, позволяет завести ферму устройств, «раскидать тесты» по нескольким машинам и выжать из них максимум.
Emcee обеспечивает следующие преимущества:
- Добиться максимальной производительности. Если один Воркер не работает, Очередь перекидывает тест другому. Как только Воркер завершает тест, он тут же получает новый.
- Выбрать удобный способ тестирования. Платформа работает на машинах организации или в облаке.
- Запускаться, когда нужно. Возможна настройка тестов: от релиза к релизу, по запросу или по расписанию.
- Масштабировать автотесты. Система распределяет их между рабочими устройствами, собирает результаты, предоставляет отчеты и аналитику.
- Отслеживать поломку тестов. Автотесты могут поломаться или сразу не заработать. Чтобы отслеживать это, используют логи logcat по каждому. Также можно включить запись экрана при запусках, чтобы попробовать найти ошибки.
Что делает Emcee:
- управляет симуляторами на ферме Apple-компьютеров;
- раскидывает тесты по Workers;
- организует очередь;
- перезапускает автотесты при сбое Воркера или перекидывает на другой Worker;
- предоставляет отчеты по результатам выполнения, а также делает многое другое.
По данным разработчиков инструмента, один из клиентов запускает 450 000 автотестов в сутки.
Ниже мы более детально разберем, как устроен новый инструмент для тестирования мобильных приложений.
Как работает Emcee
Если коротко, есть Очередь (аналог редактора из примера выше), Воркеры / Машины (аналог авторов) и Клиент, который отправляет тесты в очередь и получает результат.
Для запуска используется команда, в которой указывают Очередь и Воркеров:
Emcee runTests --queue Q --worker A --worker B --worker C
Что происходит под капотом:
- Запускается сама Очередь — queue Q. Она поднимает Воркеров: worker A, worker B, worker С.
- Очередь queue Q берет тесты, а затем разделяет на небольшие кусочки (бакеты), которые исполняет Воркер. Один бакет может содержать несколько автотестов.
- Workers получают бакеты и начинают исполнять. Когда Worker заканчивает тест, он получает следующий.
Таким образом, тесты исполняются параллельно на всей ферме устройств. Это дает возможность выжать максимум производительности и сэкономить время на прогонах.
Очередь агрегирует (собирает) результаты тестов подобно тому, как редактор получает статьи от авторов. После этого Queue возвращает клиенту результаты тестов в определенному формате (как редактор формирует отчет для заказчика).
В Emcee можно получить результаты в разных форматах:
- Файл Junit xml. В XML-отчете содержится информация, какие тесты прошли, какие упали. Данные можно отдать в TeamCity для обработки (CI/CD-решение для сборки, управления конфигурацией, статического анализа и инспекции кода).
- Файл Allure. В Result bundle попадает подробная информация со всех прогонов и со всех машин (так, как будто бы все тесты запускали на одной машине). Резалт-бандл содержит данные, на основе которых можно построить Allure Report. Бесплатный инструмент используется для формирования и визуализации отчетов по прогонам автотестов.
- DYI (бинарные плагины). Вариант для тех, кому важно получить максимально детализированную информацию по тому, что происходит на воркере: когда Worker взял бакет, когда стартовал автотест, когда закончил, чем завершился тест.
Как работает Очередь
Queue (Очередь):
- берет тесты;
- разбивает на кусочки (бакеты);
- раскидывает бакеты по воркерам;
- собирает и выдает результат.
Ее можно сравнить с редактором проекта, который получил задачу на 30 текстов, разделил ее на несколько заданий и раздал 3–5 авторам, а затем собрал результаты и выдал заказчику. Но может быть ситуация, когда автор не справился с задачей: заболел, не успел. Редактор в таком случае передает задачу другому исполнителю или помогает текущему справиться.
Воркеры тоже могут сбоить: например, закончилось место на жестком диске. В результате Worker фэйлит тест. Очередь попытается перезапустить тест на том же Воркере или на другой машине. Для запуска Workers Очередь отправляет ему свой binary, а сам Воркер поднимает через lauchd.
В реальной жизни редактор может раздать задачи в разных форматах:
- по 1 штуке каждому автору;
- по несколько штук (пачкой).
Точно так же работает и Очередь. Она может раздать:
- каждому воркеру по 7 тестов;
- каждому воркеру по .xctest-бандлу.
Как работает Воркер
В случае с Android Воркер запускает Докер-контейнеры на сервере. Например, Worker-у нужны симуляторы реальных устройств на iOS. В Emcee процессы автоматизированы: Worker сам запускает симуляторы, а после использования убивает их.
Но поднять симуляторы на iOS недостаточно. Нужно их еще дополнительно настроить. Это можно сравнить с тем, когда пользователь включает и настраивает айфон после покупки. Появляются экраны приветствия, выбора языка, Face ID и так далее. В процессе пользователь видит полезные подсказки: как работать с клавиатурой и т.д. Автотесты «спотыкаются» на них и падают. «Эмси» же умеет настраивать стейт симулятора так, чтобы он был стабильным и не становился причиной падения автотестов.
Дальше остается прогнать тесты. Здесь не все просто: симулятор может зависнуть. Точно так же и с симуляторами. Воркер «Эмси» отслеживает, чем закончилось на устройстве выполнение каждой вызванной утилиты. При необходимости — прибивает ее и запускает снова. Получается, что Worker мейнтейнит весь стейт, и тестировщикам не нужно тратить на это время.
В Emcee есть resultStreamPath: с его помощью отслеживают выполнение каждого автотеста в режиме реального времени.
Как запускать тесты в Emcee
Emcee доступен локально или в облаке (Emcee Cloud Platform). Есть бесплатная версия с установкой из github, поддерживающая запуск до 10 симуляторов/эмуляторов для iOS и Android. Если автотестов не очень много, все 10 симуляторов не задействуются: тексты группируются по бакетам.
Чтобы запустить первые автотесты онлайн, необходимо зарегистрироваться на платформе российского облачного сервиса emcee.cloud. После создания и подтверждения аккаунта на сайте появляется сообщение о том, что пользователю доступна платформа для автотестов.
Ниже пошаговая инструкция, как запустить автотесты на Emcee онлайн после авторизации в личном кабинете.
- Выбрать платформу из списка — iOS, Android, Appium.
Загрузить файлы приложения и тестов.
Проверить загрузку и перейти на следующий этап.
Проставить галочки и выбрать из списка автотестов те, которые необходимо прогнать.
Задать параметры (эту стадию можно пропустить). «Эмси» предлагает указать локализацию (язык), разрешение экране, DPI, уровень Android API (API27, API29, API32).
Нажать Start Tests для запуска автотестов.
Получить результаты (отображаются в Test history). Отобразятся дата начала, длительность, результаты (сколько завершилось успешно, сколько упало) и т.д.
По каждому автотесту можно увидеть более детальную информацию.
Кнопка Save as предлагает выгрузку в Junit xml или Allure.
Облачная версия удобна тем, что дает загрузить тесты, которые будут исполняться на компьютерах Авито. Это вариант быстрого старта: свое железо не нужно. При этом каждый изолирован, а заказчик платит только за время прогонов. Есть API и возможность встроить в свой CI через GitHub Actions.
Как развернуть Emcee на своей инфраструктуре
Emcee доступен On-Premise для того, чтобы развернуть тест-раннер на железе компании и собрать собственную тестовую ферму. Как это работает? Допустим, в ней будут две машины: MacBook Mac и Mini. Emcee сам объединит компьютеры по ssh или с помощью другой технологии, и эти устройства уже будут работать с тестами.
Чтобы развернуть Emcee On-Prem для iOS, нужны MacOS, XCode, Simulator runtime. Для работы с Андроид необходимы Linux-сервер, KVM, Docker, настроенный Artifactory. Требования — 4 Гб RAM и 1.15 CPU для одного контейнера с Воркером. Artifactory необходим для передачи файлов в системе Emcee. Если у организации нет облачного менеджера хранилища артефактов, стоит развернуть опенсорс-версию рядом с Эмси.
Как запускать Emcee для параллельного тестирования мобильных приложений на Android, iOS:
- в Docker;
- используя Docker Compose;
- через Kubernetes.
Kubernetes позволяет построить масштабируемую систему с тысячами Воркеров. При запуске через Kubernetes можно настроить способы взаимодействия с Workers на различных серверах.
Дополнительные преимущества тест-раннера «Эмси» от Авито:
- Логи каждого воркера за счет интеграции с Kibana (SSH, xcodebuild, xcrun simctl).
- Нативные xctest для iOS и любые espresso-совместимые фреймворки на Андроид.
- Графики по каждому Воркеру. Помогают понять, живой он или нет (Alive / not Alive), как быстро выполняются автотесты, сколько бакетов в процессе.
- Возможность интеграции Emcee с сервисами компании.
Переход на отечественные проекты — часть импортозамещения. Emcee актуален тем, кто искал замену AWS-серверам Amazon (AWS Device Farm) или аналогичным иностранным решениям.