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

885 views

Published on

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

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
885
On SlideShare
0
From Embeds
0
Number of Embeds
181
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Как мы разгоняли тесты: Кудинов Илья, QA Engineer От bash-скриптов до облака
  2. 2. Зачем нужно разгонять тесты?
  3. 3. Юнит-тестов “как в книжках” почти не бывает Expectation Reality
  4. 4. Количество тестов в проекте
  5. 5. Время выполнения тестов Желание запускать тесты
  6. 6. Сравнение эффективности методов Однопоточный запуск: ~6.5 т/с ~70 минут на 27000 тестов!
  7. 7. А может, не будем запускать каждый раз все тесты?А может, не будем каждый раз запускать ВСЕ тесты?
  8. 8. Попробуем поделить тесты вручную?
  9. 9. Напишем утилиту, которая будет делить тесты между потоками поровну?
  10. 10. Не все тесты одинаковы! Поток #1 Поток #2 Поток #3 Поток #4 Количество тестов Время выполнения
  11. 11. Однопоточный запуск: ~6.5 т/с Распределение поровну: ~17 т/с ~26 минут на 27000 тестов! Сравнение эффективности методов
  12. 12. Нам необоходимо средство для автоматического и равномерного разделения тестов по потокам
  13. 13. Начинаем поиск готовых решений! Параллелизация тестов PHPUnit
  14. 14. И почти всё что мы нашли – реализация уже отвергнутых нами методов
  15. 15. Оригинальный метод – несколько процессов “разгребают” общую очередь тестов
  16. 16. PHPUnit делает очень много внутренней работы Поток #1 Поток #2 Поток #3 Поток #4 Количество тестов Время выполнения Время работы внутренних функций PHPUnit
  17. 17. Однопоточный запуск: ~6.5 т/с Распределение поровну: ~17 т/с Разгребание общей очереди: ~21 т/с ~21 минута на 27000 тестов! Сравнение эффективности методов
  18. 18. Разработчики PHPUnit обещают реализацию многопоточного запуска из коробки?
  19. 19. Вывод: надо разработать что-то своё!
  20. 20. Первое решение – отделим “большие” тесты от “маленьких”
  21. 21. Однопоточный запуск: ~6.5 т/с Распределение поровну: ~17 т/с Разгребание общей очереди: ~21 т/с Отделение больших тестов: ~33 т/с ~14 минут на 27000 тестов! Сравнение эффективности методов
  22. 22. Второе решение – необходимо хранить информацию о времени работы каждого теста!
  23. 23. Для избежания переизбытка информации необходим централизованный сбор статистики!
  24. 24. И для этого нам идеально подходит TeamCity!
  25. 25. Лучший способ управления такой утилитой?
  26. 26. Итоговая схема Многопоточной пускалки КОМПОНЕНТ СБОРА И ХРАНЕНИЯ СТАТИСТИКИ КОМПОНЕНТ ЗАПУСКА ТЕСТОВ КОМПОНЕНТ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ РАЗЛИЧНЫЕ СПОСОБЫ ВЫВОДА РЕЗУЛЬТАТОВ
  27. 27. Компонент сбора и сохранения статистики БД TeamCity БД для хранения статистики тест => время файл => время Магия
  28. 28. Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье 7 состояний с накапливаемыми данными Чем новее статистика – тем больший “вес” она имеет при распределении тестов Компонент сбора и сохранения статистики Возраст статистики Вес статистики < 1 суток 100 < 2 суток 50 < 3 суток 25 > 3 суток 10
  29. 29. Длительность тестов Потоки с уже распределёнными тестами Тест с известной длительностью Компонент распределения тестов по потокам
  30. 30. Мастер-процесс Поток Поток Поток Поток Поток Файл отчётаФайл отчёта Файл отчёта Файл отчёта Файл отчёта Файл отчёта Компонент запуска тестов
  31. 31. Мастер-процесс Поток Поток Поток Поток Поток Поток Компонент запуска тестов
  32. 32. Вывод результатов ● Текстовый вывод для запуска из консоли ● По пятницам — с котиками! ● Вывод в формате TeamCity ● Вывод данных для подсчёта Code Coverage ● v1.0 — после окончания работы ● v1.5 — пачками в процессе работы ● v2.0 — в реальном времени
  33. 33. Оно адаптируется!
  34. 34. Однопоточный запуск: ~6.5 т/с Распределение поровну: ~17 т/с Разгребание общей очереди: ~21 т/с Отделение больших тестов: ~33 т/с Многопоточная пускалка: ~65 т/с ~7 минут на 27000 тестов! Сравнение эффективности методов
  35. 35. PROFIT 1) Тесты запускаются чаще! 2) Разгруженные агенты TC! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость!
  36. 36. Не rocket science! ● Изначальная версия разработана одним человеком «на коленке» в свободное от работы время; ● <1000 строк кода на всё! ● Никакой «магии» кроме форков
  37. 37. RunKit  Расширение для PHP  Расширенный инструментарий для подмены классов и методов  Собственная песочница с суперглобальными переменными  Сбрасывает кеш PHP при каждом моке ):
  38. 38. Отправляемся в облака!
  39. 39. Облачный скриптовый фреймворк  Развитие уже существовавшего фреймворка  Выполнение задач на распределённой системе машин  Минимальные правки в имеющихся скриптах  Не зависит от типа выполняемой работы  Отказоустойчивость
  40. 40. Клиент Фреймворк Облако Машина в облаке Машина в облаке Машина в облаке Машина в облаке Машина в облаке Машина в облаке Мастер Воркер Воркер Воркер Воркер Воркер Воркер Воркер Воркер Воркер Воркер WebAPI Облачный скриптовый фреймворк
  41. 41. Однопоточный запуск: ~6.5 т/с Распределение поровну: ~17 т/с Разгребание общей очереди: ~21 т/с Отделение больших тестов: ~33 т/с Многопоточная пускалка: ~65 т/с Облачная пускалка: ~150 т/с Сравнение эффективности методов ~3 минуты на 27000 тестов!
  42. 42. Есть куда развиваться!  Рассчёт оптимального количества потоков  Обработка и выделение фаталящих тестов  Автоматический поиск зависимостей  Отделение от нашего проекта  ...
  43. 43. badoo.com vk.com/badoocom fb.com/BadooMoscow twitter.com/BadooDev habrahabr.ru/company/badoo/ vk.com/relzeg fb.com/relzeg Skype: relzeg ;)

×