Эволюция ускорения юнит-тестов в Badoo - от баш-скриптов...

Preview:

DESCRIPTION

Доклад Ильи Кудинова на SQA Days-15. 18-19 апреля, 2014, Москва. www.sqadays.com

Citation preview

Как мы разгоняли тесты:

Кудинов Илья, QA Engineer

От bash-скриптов до облака

Зачем нужно разгонять тесты?

Юнит-тестов “как в книжках” почти не бывает

Expectation Reality

Количество тестов в проекте

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

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

Сравнение эффективности методов

Однопоточный запуск: ~6.5 т/с

~70 минут на 27000 тестов!

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

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

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

Не все тесты одинаковы!

Поток #1 Поток #2 Поток #3 Поток #4

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

Однопоточный запуск: ~6.5 т/с

Распределение поровну: ~17 т/с

~26 минут на 27000 тестов!

Сравнение эффективности методов

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

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

Параллелизация тестов PHPUnit

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

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

PHPUnit делает очень много внутренней работы

Поток #1 Поток #2 Поток #3 Поток #4

Количество тестовВремя выполненияВремя работы внутренних функций PHPUnit

Однопоточный запуск: ~6.5 т/с

Распределение поровну: ~17 т/с

Разгребание общей очереди: ~21 т/с

~21 минута на 27000 тестов!

Сравнение эффективности методов

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

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

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

Однопоточный запуск: ~6.5 т/с

Распределение поровну: ~17 т/с

Разгребание общей очереди: ~21 т/с

Отделение больших тестов: ~33 т/с

~14 минут на 27000 тестов!

Сравнение эффективности методов

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

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

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

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

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

КОМПОНЕНТ СБОРА И ХРАНЕНИЯ СТАТИСТИКИ

КОМПОНЕНТ ЗАПУСКА ТЕСТОВ

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

ПО ПОТОКАМ РАЗЛИЧНЫЕ СПОСОБЫВЫВОДА РЕЗУЛЬТАТОВ

Компонент сбора и сохранения статистики

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

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

Магия

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

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

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

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

Компонент сбора и сохранения статистики

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

< 1 суток 100

< 2 суток 50

< 3 суток 25

> 3 суток 10

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

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

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

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

Мастер-процесс

Поток Поток Поток Поток Поток

Файл отчётаФайл отчёта Файл отчёта Файл отчёта Файл отчёта Файл отчёта

Компонент запуска тестов

Мастер-процесс

Поток

ПотокПоток

Поток

Поток

Поток

Компонент запуска тестов

Вывод результатов

● Текстовый вывод для запуска из консоли ● По пятницам — с котиками!● Вывод в формате TeamCity● Вывод данных для подсчёта Code Coverage

● v1.0 — после окончания работы● v1.5 — пачками в процессе работы● v2.0 — в реальном времени

Оно адаптируется!

Однопоточный запуск: ~6.5 т/с

Распределение поровну: ~17 т/с

Разгребание общей очереди: ~21 т/с

Отделение больших тестов: ~33 т/с

Многопоточная пускалка: ~65 т/с

~7 минут на 27000 тестов!

Сравнение эффективности методов

PROFIT

1) Тесты запускаются чаще!2) Разгруженные агенты TC!2) Автоматический запуск тестов!3) Переносимость и конфигурируемость!

Не rocket science!

● Изначальная версия разработана одним человеком «на коленке» в свободное от работы время;

● <1000 строк кода на всё!

● Никакой «магии» кроме форков

RunKit

Расширение для PHP Расширенный инструментарий для подмены классов

и методов Собственная песочница с суперглобальными

переменными Сбрасывает кеш PHP при каждом моке ):

Отправляемся в облака!

Облачный скриптовый фреймворк

Развитие уже существовавшего фреймворкаВыполнение задач на распределённой системе машинМинимальные правки в имеющихся скриптахНе зависит от типа выполняемой работыОтказоустойчивость

Клиент

Фреймворк

Облако

Машина в облаке

Машина в облаке

Машина в облаке

Машина в облаке

Машина в облаке

Машина в облаке

Мастер

Воркер

Воркер

Воркер

Воркер

Воркер Воркер

Воркер

Воркер

Воркер

Воркер

WebAPI

Облачный скриптовый фреймворк

Однопоточный запуск: ~6.5 т/с

Распределение поровну: ~17 т/с

Разгребание общей очереди: ~21 т/с

Отделение больших тестов: ~33 т/с

Многопоточная пускалка: ~65 т/с

Облачная пускалка: ~150 т/с

Сравнение эффективности методов

~3 минуты на 27000 тестов!

Есть куда развиваться!

Рассчёт оптимального количества потоков Обработка и выделение фаталящих тестов Автоматический поиск зависимостей Отделение от нашего проекта ...

badoo.com

vk.com/badoocomfb.com/BadooMoscowtwitter.com/BadooDev

habrahabr.ru/company/badoo/

vk.com/relzegfb.com/relzegSkype: relzeg

;)

Recommended