Доклад Ильи Кудинова на CodeFest 2014. "Учимся на ошибках в организации и проведении тестирования".
Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная...
-
Upload
badoo-development -
Category
Technology
-
view
469 -
download
0
description
Transcript of Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная...
![Page 1: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/1.jpg)
ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ
ПРОЕКТЕ Кудинов Илья, Badoo Development
![Page 2: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/2.jpg)
Зачем это нужно?
![Page 3: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/3.jpg)
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
??? ??? ??? ???
??? ??? ??? ???
??? ??? ??? ???
![Page 4: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/4.jpg)
Время выполнения тестов
Желание запускать тесты
![Page 5: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/5.jpg)
А может, не будем запускать каждый раз все тесты?
А может, не будем каждый раз запускать ВСЕ тесты?
![Page 6: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/6.jpg)
А может, попробуем поделить тесты вручную?
![Page 7: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/7.jpg)
А может, просто напишем утилиту, которая будет делить тесты между потоками поровну?
![Page 8: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/8.jpg)
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
Разделение тестов поровну
2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
??? ??? ??? ???
??? ??? ??? ???
![Page 9: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/9.jpg)
Нам необоходимо средство для автоматического и равномерного разделения тестов по потокам
![Page 10: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/10.jpg)
Начинаем поиск готовых решений!
![Page 11: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/11.jpg)
И почти всё что мы нашли – реализация уже отвергнутых нами методов
![Page 12: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/12.jpg)
Оригинальный метод – несколько процессов “разгребают” общую очередь тестов
![Page 13: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/13.jpg)
Разработчики PHPUnit обещают реализацию многопоточного запуска из коробки?
![Page 14: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/14.jpg)
Вывод: надо разработать что-то своё!
![Page 15: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/15.jpg)
Первое решение – отделим “большие” тесты от “маленьких”
![Page 16: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/16.jpg)
Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы
Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО
минут
Разделение тестов поровну
2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
Отделение “больших” тестов
1.5 – 2 минуты 6 – 8 минут 15 – 20 минут
??? ??? ??? ???
![Page 17: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/17.jpg)
Второе решение – необходимо хранить информацию о времени работы каждого теста!
![Page 18: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/18.jpg)
Для избежания переизбытка информации необходим централизованный сбор статистики!
![Page 19: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/19.jpg)
И для этого нам идеально подходит TeamCity!
![Page 20: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/20.jpg)
Лучший способ настройки такой утилиты?
![Page 21: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/21.jpg)
Итоговая схема Многопоточной пускалки
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ
ПО ПОТОКАМ
![Page 22: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/22.jpg)
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
БД TeamCity БД для хранения статистики
Обработка информации
тест => время файл => время
Поиск соответствия тест => файл;
Простейшая система кеширования информации
для ускорения процесса
![Page 23: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/23.jpg)
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
Понедельник Вторник Среда Четверг
Пятница Суббота Воскресенье
7 состояний с накапливаемыми данными
Чем новее статистика – тем больший “вес” она имеет при распределении тестов
Возраст статистики Вес статистики
< 1 суток 100
< 2 суток 50
< 3 суток 25
> 3 суток 10
![Page 24: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/24.jpg)
КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ
Длительность тестов
Потоки с уже распределёнными тестами
Тест с известной длительностью
![Page 25: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/25.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
![Page 26: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/26.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Сбор файлов с тестами
![Page 27: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/27.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
![Page 28: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/28.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
![Page 29: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/29.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
![Page 30: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/30.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
![Page 31: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/31.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
![Page 32: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/32.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо)
![Page 33: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/33.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо) ???
![Page 34: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/34.jpg)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного XML-файла PHPUnit
Расчёт времени выполнения тестов
Сбор файлов с тестами
Распределение тестов по потокам
Генерация динамического
XML-конфига
Запуск процессов PHPUnit с нужными
параметрами
Вывод информации с помощью наших
TestListener'ов
Сбор и сохранение статистики
(если необходимо) ???
P R O F I T ! ! !
![Page 35: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/35.jpg)
Кастомные TestListener'ы
![Page 36: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/36.jpg)
Схема запуска 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: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/37.jpg)
Итого мы получили самостоятельно адаптирующуюся
под обстоятельства систему!
![Page 38: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/38.jpg)
PROFIT
1) Тесты запускаются чаще! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость! 4) Going OpenSource – stay tuned!
![Page 39: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте".](https://reader033.fdocuments.in/reader033/viewer/2022052412/557cf84fd8b42a071b8b49f0/html5/thumbnails/39.jpg)
badoo.com
vk.com/badoocom fb.com/BadooMoscow twitter.com/BadooDev
habrahabr.ru/company/badoo/
vk.com/relzeg fb.com/relzeg