В 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
Мы готовы вас поддержать
Мы готовы уделить время и поддержать вас с внедрением, настроить вам прогон тестов и получение результатов, дать советы по организации тестовой фермы.
Стучитесь к нам на специальном лендинге или в телеграме.