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

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

Date post: 14-Jun-2015
Category:
Upload: badoo-development
View: 460 times
Download: 0 times
Share this document with a friend
Description:
Доклад о том, как провести 17 тысяч тестов за три минуты, помочь тестировщикам не умереть со скуки и научить автоматическое тестирование быть ещё более автоматическим. Из доклада вы узнаете: 1. Как мы пришли к необходимости такого решения и как решали эти проблемы изначально. 2. Какие решения этой проблемы уже существуют в мире OpenSource и почему мы от них отказались. 3. Какие "гениальные" идеи мы пытались реализовать и почему все их отвергли. 4. На какой архитектуре мы остановились и как она себя показала (с нескучными цифрами и графиками!). 5. Какие дополнительные возможности приносит сотрудничество PHPUnit с TeamCity и как с их помощью тестировщики могут терроризировать разработчиков. 6. Что обещают сделать в этом направлении разработчики PHPUnit и как обстоят эти дела на данный момент.
Popular Tags:
39
ОПТИМАЛЬНАЯ ПАРАЛЛЕЛИЗАЦИЯ ЮНИТ-ТЕСТОВ В БОЛЬШОМ ПРОЕКТЕ Кудинов Илья, Badoo Development
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


Recommended