44
Как мы разгоняли тесты: Кудинов Илья, QA Engineer От bash-скриптов до облака

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

  • Upload
    sqalab

  • View
    578

  • Download
    6

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

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

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

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

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

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

Expectation Reality

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Магия

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

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

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

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

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

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

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

< 1 суток 100

< 2 суток 50

< 3 суток 25

> 3 суток 10

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

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

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

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

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

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

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

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

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

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

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

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

Поток

ПотокПоток

Поток

Поток

Поток

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PROFIT

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

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

Не rocket science!

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

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

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

Page 37: Эволюция ускорения юнит-тестов в Badoo - от баш-скриптов до облака
Page 38: Эволюция ускорения юнит-тестов в Badoo - от баш-скриптов до облака

RunKit

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

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

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

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

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

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

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

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

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

Клиент

Фреймворк

Облако

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

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

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

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

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

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

Мастер

Воркер

Воркер

Воркер

Воркер

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

Воркер

Воркер

Воркер

Воркер

WebAPI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

badoo.com

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

habrahabr.ru/company/badoo/

vk.com/relzegfb.com/relzegSkype: relzeg

;)