Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная...

39
ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ ПРОЕКТЕ Кудинов Илья, Badoo Development

Upload: badoo-development

Post on 14-Jun-2015

474 views

Category:

Technology


0 download

DESCRIPTION

Доклад о том, как провести 17 тысяч тестов за три минуты, помочь тестировщикам не умереть со скуки и научить автоматическое тестирование быть ещё более автоматическим. Из доклада вы узнаете: 1. Как мы пришли к необходимости такого решения и как решали эти проблемы изначально. 2. Какие решения этой проблемы уже существуют в мире OpenSource и почему мы от них отказались. 3. Какие "гениальные" идеи мы пытались реализовать и почему все их отвергли. 4. На какой архитектуре мы остановились и как она себя показала (с нескучными цифрами и графиками!). 5. Какие дополнительные возможности приносит сотрудничество PHPUnit с TeamCity и как с их помощью тестировщики могут терроризировать разработчиков. 6. Что обещают сделать в этом направлении разработчики PHPUnit и как обстоят эти дела на данный момент.

TRANSCRIPT

Page 1: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

ПРОЕКТЕ Кудинов Илья, Badoo Development

Page 2: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Зачем это нужно?

Page 3: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы

Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО

минут

??? ??? ??? ???

??? ??? ??? ???

??? ??? ??? ???

Page 4: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

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

Page 5: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

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

Page 6: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 7: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 8: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы

Однопоточный запуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО

минут

Разделение тестов поровну

2 – 2.5 минуты 10 – 15 минут 20 – 25 минут

??? ??? ??? ???

??? ??? ??? ???

Page 9: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 10: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 11: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 12: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 13: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 14: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 15: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 16: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Схема запуска 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. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 18: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 19: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 20: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

Page 21: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

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

ПО ПОТОКАМ

Page 22: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

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

Обработка информации

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

Поиск соответствия тест => файл;

Простейшая система кеширования информации

для ускорения процесса

Page 23: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ

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

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

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

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

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

< 1 суток 100

< 2 суток 50

< 3 суток 25

> 3 суток 10

Page 24: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

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

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

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

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

Page 25: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Page 26: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Сбор файлов с тестами

Page 27: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

Page 28: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Page 29: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Page 30: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Page 31: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Page 32: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо)

Page 33: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо) ???

Page 34: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ

Чтение входного XML-файла PHPUnit

Расчёт времени выполнения тестов

Сбор файлов с тестами

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

Генерация динамического

XML-конфига

Запуск процессов PHPUnit с нужными

параметрами

Вывод информации с помощью наших

TestListener'ов

Сбор и сохранение статистики

(если необходимо) ???

P R O F I T ! ! !

Page 35: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Кастомные TestListener'ы

Page 36: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

Схема запуска 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. "Оптимальная параллелизация юнит тестов в большом проекте"

Итого мы получили самостоятельно адаптирующуюся

под обстоятельства систему!

Page 38: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

PROFIT

1) Тесты запускаются чаще! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость! 4) Going OpenSource – stay tuned!

Page 39: Доклад Ильи Кудинова на РИТ++ 2013. "Оптимальная параллелизация юнит тестов в большом проекте"

badoo.com

vk.com/badoocom fb.com/BadooMoscow twitter.com/BadooDev

habrahabr.ru/company/badoo/

vk.com/relzeg fb.com/relzeg