В iOS-приложении Авито куча UI-тестов — вы это уже наверняка знаете, потому что мы говорим про них постоянно. Это позволяет нам релизиться раз в неделю, причём регрессионное тестирование с ручными проверками мы проводим раз в две недели. Между ними в релиз идёт приложение, которое протестировано только нашими UI- и unit-тестами.

Чтобы поддерживать такие масштабы автотестирования, мы написали тест-раннер Emcee, который умеет скейлиться в ширину по физическим машинкам. Он доступен в нашем Гитхаб-репозитории.

Что у нас с тестами

Число тестов в приложении Авито постоянно растёт. Сейчас больше всего — 1500 штук — быстрых компонентных UI-тестов. Они совмещают в себе интерактивность XCUI-тестов со скоростью unit-тестов. По сути это экраны в изоляции, но с интерактивными проверками их работы. Мы запускаем UI-тесты на каждый pull request на двух версиях iOS — самой старой поддерживаемой и самой новой. То есть фактически запускается 3000 тестов.

А вот от XCUI-тестов на pull request мы отказались уже как год: они завязаны на бэкенд (end-to-end), а он любит жить своей жизнью. В момент прогона может происходить обновление СУБД или выкатка новых версий сервисов, которые всё ломают. Однако XCUI-тесты гоняются на релизе, а также каждую ночь с доставкой отчётов в команду утром. Таких тестов осталось порядка 600.

Даже если представить, что каждый компонентный тест длится в среднем 3 секунды, то 3000 х 3 даст 9000 секунд. А это 2,5 часа. Тем не менее, билд с тестами у нас идёт около 15 минут.

Тест-раннер Emcee

Скорость билда достигается с помощью нашего тест-раннера Emcee. Он:

  • Управляет симуляторами на нашей ферме Apple-компьютеров.

  • Организует очередь из тестов.

  • Пишет аналитику по выполнению тестов в Grafana.

  • Производит нужное количество перезапусков.

  • Запускает тесты только там, где они могут пройти. Например, только на компьютерах с установленным симулятором и Xcode нужной версии.

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

  • Интегрирует результаты тестового прогона в нашу инфраструктуру: тестохранилку и систему отчётов.

Точные цифры

Наши компонентные тесты на PR суммарно длятся 6 часов: как минимум столько времени их гонял бы один миник с одним симулятором. Фактически же билд проходит за 15 минут.

Наши 600 end-to-end XCUI-тестов суммарно идут 41 час. Они запускаются под четырьмя разными версиями iOS, и на деле всё распараллеливается и проходит за 50 минут.

Что нужно, чтобы начать использовать Emcee у себя

Нужны:

  • Желание разобраться в новом. Мы проделали большую работу, чтобы всё для вас упростить.

  • Компьютеры Mac. Мы используем Mac mini, потому что их ещё как-то можно запихать в стойки. Но можно юзать и ноутбуки, если у вас валяются свободные. А ещё можно арендовать Apple-машины у провайдеров.

  • Ваше iOS-приложение с тестами.

Мы написали короткий гайд по тому, как можно быстро стартовать.

Кому подойдёт Emcee

Смело пробуйте Emcee, если:

  • Хотите уменьшить time to market своего приложения и делаете ставку на автотесты.

  • Тесты стали занимать значительное время при регрессе и на pull request-ах, и теперь вы ищете способ их ускорить.

  • Хотите почти полностью уйти от ручного тестирования и понимаете, что тестов потребуется много, но не смогли найти инструмент для их прогона. 

  • Любите классные технологии и хотите заколлабиться с инженерами Авито.

Что говорят те, кто уже использует Emcee

«Мы обязательно запускаем UI-тесты при мерже фиче-ветки в мастер-ветку или по запросу. Когда у нас было порядка 150 тестов, их прогон занимал около 10 минут на одном минике. В нашем случае это ок. Когда же количество тестов выросло до 500+, время прогона увеличилось до 30-35 минут. Мы поняли, что это достаточно долго для того, чтобы получить фидбэк о состоянии приложения. 

Мы рассматривали решения по переезду в облако для более быстрого запуска тестов, но цена поднятия MacOS-инстансов подталкивала поискать альтернативы. В итоге мы пришли к Emcee-раннеру от Авито: настроили ферму из 5 машин, на которых запускаем по 5 симуляторов. В итоге время прогонов тестов уменьшилось до 10-12 минут». 

Антон из Bolt

«Когда мы начали активно внедрять UI-тесты, чтобы ускорить регрессионное тестирование, то столкнулись с тем, что они выполняются довольно долго. В какой-то момент прогон тестов стал занимать полтора часа! Emcee позволил распараллелить тесты на несколько Mac mini и кратно сократить длительность прогона».

Евгений из ivi

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

Для запуска тестов хотелось построить надёжную in-house инфраструктуру на основе коробочного и желательно open source решения. Мы нашли только один такой инструмент — Emcee. С внедрением пришлось немного повозиться, но его один раз настраиваешь, а дальше всё работает как часы. Только бери, да подключай новые ноды и замеряй ускорение прогона тестов. 

Сейчас у нас порядка 800 e2e iOS-тестов, которые пробегают за 2-3 часа. Наш релизный цикл сократился с 4-5 недель до 2, а тестировщикам стало сильно проще выделять время на дополнительные активности в виде улучшения процессов и развития тестовой документации».

Андрей из Space307

Мы готовы вас поддержать

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

Стучитесь к нам на специальном лендинге или в телеграме. 

Комментарии (0)