Оптимальная параллелизация юнит-тестов в большом...

Post on 15-Jun-2015

476 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

ПРОЕКТЕ Кудинов Илья, 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

top related