Как сократить время полного прогона тестов
Что проверяют
Есть ли у вас системный подход, а не только идея «запустить параллельно».
Как отвечать
По убыванию отдачи.
1. Перераспределить по уровням. Самая частая причина медленного прогона это проверки, выполняемые через интерфейс, хотя их место на уровне API или юнитов. Валидация формы, расчёт скидки, обработка ошибок сервера проверяются в десятки раз быстрее без браузера. Перенос десятка таких сценариев обычно даёт больше, чем любая инфраструктурная оптимизация.
2. Параллельный запуск. По потокам внутри машины и по нескольким машинам с разделением набора на части. Обязательное условие: тесты независимы и не делят данные, иначе параллельность даст ложные падения.
3. Починить нестабильные тесты. Они удваивают время дважды: сначала из-за автоматических повторов, потом из-за ручного перезапуска и разбора. Нестабильный тест либо чинится, либо изолируется, но не остаётся в общем наборе.
4. Ускорить подготовку и очистку. Не поднимать окружение для каждого теста: общий контейнер на весь класс или прогон, откат транзакции вместо пересоздания базы, готовые образы вместо развёртывания с нуля, подготовка данных через API или напрямую в базе вместо кликов.
5. Убрать ожидания. Фиксированные паузы это чистая потеря времени. Заменяются явными ожиданиями условия.
6. Разделить наборы. На пул-реквест быстрый набор из юнитов, API и дымовых проверок, полный прогон по расписанию или перед релизом. Плюс выбор подмножества по затронутым областям, если инструменты позволяют.
7. Кэшировать в конвейере: зависимости, собранные артефакты, слои образов. Часто оказывается, что половина времени уходит не на тесты, а на установку зависимостей.
И обязательный первый шаг: измерить. Отчёт с длительностью каждого теста почти всегда показывает, что основное время съедают несколько десятков, а не весь набор равномерно.
Где спотыкаются
Начинают с параллельного запуска на связанных тестах и получают хаос.
Не смотрят, какие тесты долгие, и оптимизируют вслепую.
Терпят нестабильные тесты.
Поднимают полное окружение на каждый тест.