39
ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ ПРОЕКТЕ Кудинов Илья, Badoo Development

Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

  • Upload
    ontico

  • View
    460

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ

ПРОЕКТЕ Кудинов Илья, Badoo Development

Page 2: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Зачем это нужно?

Page 3: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы

Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО

минут

??? ??? ??? ???

??? ??? ??? ???

??? ??? ??? ???

Page 4: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Время выполнения тестов

Желание запускать тесты

Page 5: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

А может, не будем запускать каждый раз все тесты?

А может, не будем каждый раз запускать ВСЕ тесты?

Page 6: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

А может, попробуем поделить тесты вручную?

Page 7: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

А может, просто напишем утилиту, которая будет делить тесты между потоками поровну?

Page 8: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы

Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО

минут

Разделение тестов поровну

2 – 2.5 минуты 10 – 15 минут 20 – 25 минут

??? ??? ??? ???

??? ??? ??? ???

Page 9: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Нам необоходимо средство для автоматического и равномерного разделения тестов по потокам

Page 10: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Начинаем поиск готовых решений!

Page 11: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

И почти всё что мы нашли – реализация уже отвергнутых нами методов

Page 12: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Оригинальный метод – несколько процессов “разгребают” общую очередь тестов

Page 13: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Разработчики PHPUnit обещают реализацию многопоточного запуска из коробки?

Page 14: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Вывод: надо разработать что-то своё!

Page 15: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Первое решение – отделим “большие” тесты от “маленьких”

Page 16: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы

Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО

минут

Разделение тестов поровну

2 – 2.5 минуты 10 – 15 минут 20 – 25 минут

Отделение “больших” тестов

1.5 – 2 минуты 6 – 8 минут 15 – 20 минут

??? ??? ??? ???

Page 17: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Второе решение – необходимо хранить информацию о времени работы каждого теста!

Page 18: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Для избежания переизбытка информации необходим централизованный сбор статистики!

Page 19: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

И для этого нам идеально подходит TeamCity!

Page 20: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Лучший способ настройки такой утилиты?

Page 21: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Итоговая схема Многопоточной пускалки

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ

ПО ПОТОКАМ

Page 22: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

БД TeamCity БД для хранения статистики

Обработка информации

тест => время файл => время

Поиск соответствия тест => файл;

Простейшая система кеширования информации

для ускорения процесса

Page 23: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

Понедельник Вторник Среда Четверг

Пятница Суббота Воскресенье

7 состояний с накапливаемыми данными

Чем новее статистика – тем больший “вес” она имеет при распределении тестов

Возраст статистики Вес статистики

< 1 суток 100

< 2 суток 50

< 3 суток 25

> 3 суток 10

Page 24: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ

Длительность тестов

Потоки с уже распределёнными тестами

Тест с известной длительностью

Page 25: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Page 26: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Сбор файлов с тестами

Page 27: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Page 28: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Page 29: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Page 30: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Page 31: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Page 32: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо)

Page 33: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо) ???

Page 34: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Распределение тестов по потокам

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо) ???

P R O F I T ! ! !

Page 35: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Кастомные TestListener'ы

Page 36: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Схема запуска 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 минут

Page 37: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

Итого мы получили самостоятельно адаптирующуюся

под обстоятельства систему!

Page 38: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

PROFIT

1) Тесты запускаются чаще! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость! 4) Going OpenSource – stay tuned!

Page 39: Оптимальная параллелизация юнит-тестов в большом проекте / Илья Кудинов (Badoo)

badoo.com

vk.com/badoocom fb.com/BadooMoscow twitter.com/BadooDev

habrahabr.ru/company/badoo/

vk.com/relzeg fb.com/relzeg