ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ ПРОЕКТЕ Кудинов Илья, Badoo Development
Jun 14, 2015
ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ
ПРОЕКТЕ Кудинов Илья, Badoo Development
Зачем это нужно?
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
??? ??? ??? ???
??? ??? ??? ???
??? ??? ??? ???
Время выполнения тестов
Желание запускать тесты
А может, не будем запускать каждый раз все тесты?
А может, не будем каждый раз запускать ВСЕ тесты?
А может, попробуем поделить тесты вручную?
А может, просто напишем утилиту, которая будет делить тесты между потоками поровну?
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
Разделение тестов поровну
2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
??? ??? ??? ???
??? ??? ??? ???
Нам необоходимо средство для автоматического и равномерного разделения тестов по потокам
Начинаем поиск готовых решений!
И почти всё что мы нашли – реализация уже отвергнутых нами методов
Оригинальный метод – несколько процессов “разгребают” общую очередь тестов
Разработчики PHPUnit обещают реализацию многопоточного запуска из коробки?
Вывод: надо разработать что-то своё!
Первое решение – отделим “большие” тесты от “маленьких”
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
Разделение тестов поровну
2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
Отделение “больших” тестов
1.5 – 2 минуты 6 – 8 минут 15 – 20 минут
??? ??? ??? ???
Второе решение – необходимо хранить информацию о времени работы каждого теста!
Для избежания переизбытка информации необходим централизованный сбор статистики!
И для этого нам идеально подходит TeamCity!
Лучший способ настройки такой утилиты?
Итоговая схема Многопоточной пускалки
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ
ПО ПОТОКАМ
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
БД TeamCity БД для хранения статистики
Обработка информации
тест => время файл => время
Поиск соответствия тест => файл;
Простейшая система кеширования информации
для ускорения процесса
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
Понедельник Вторник Среда Четверг
Пятница Суббота Воскресенье
7 состояний с накапливаемыми данными
Чем новее статистика – тем больший “вес” она имеет при распределении тестов
Возраст статистики Вес статистики
< 1 суток 100
< 2 суток 50
< 3 суток 25
> 3 суток 10
КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ
Длительность тестов
Потоки с уже распределёнными тестами
Тест с известной длительностью
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Сбор файлов с тестами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо) ???
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо) ???
P R O F I T ! ! !
Кастомные TestListener'ы
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
Разделение тестов поровну
2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
Отделение “больших” тестов
1.5 – 2 минуты 6 – 8 минут 15 – 20 минут
Наша многопоточная пускалка 45 – 60 секунд 3 – 4 минуты 6 – 8 минут
Итого мы получили самостоятельно адаптирующуюся
под обстоятельства систему!
PROFIT
1) Тесты запускаются чаще! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость! 4) Going OpenSource – stay tuned!
badoo.com
vk.com/badoocom fb.com/BadooMoscow twitter.com/BadooDev
habrahabr.ru/company/badoo/
vk.com/relzeg fb.com/relzeg