SlideShare a Scribd company logo
1 of 39
Download to read offline
ОПТИМАЛЬНАЯПАРАЛЛЕЛИЗАЦИЯ
ЮНИТ-ТЕСТОВВ БОЛЬШОМ
ПРОЕКТЕ
Кудинов Илья, Badoo Development
Зачем это нужно?
Схема запуска 6.5к тестов 16к тестов 16к тестов,
нагруженные серверы
Однопоточныйзапуск 10 – 15 минут 35 – 40 минут
ОБОЖЕКАКМНОГО
минут
??? ??? ??? ???
??? ??? ??? ???
??? ??? ??? ???
Время выполнения тестов
Желаниезапускать тесты
А может, не будем запускать каждый раз все тесты?
А может, не будем каждый раз запускать ВСЕ тесты?
А может, попробуем поделить тесты вручную?
А может, просто напишем утилиту, которая будет делить
тесты между потоками поровну?
Схема запуска 6.5к тестов 16к тестов 16к тестов,
нагруженные серверы
Однопоточныйзапуск 10 – 15 минут 35 – 40 минут
ОБОЖЕКАКМНОГО
минут
Разделение тестов
поровну 2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
??? ??? ??? ???
??? ??? ??? ???
Нам необоходимо средство для автоматического
и равномерного разделения тестов по потокам
Начинаем поиск готовых решений!
И почти всё что мы нашли – реализация
уже отвергнутых нами методов
Оригинальный метод – несколько процессов“разгребают” общую
очередь тестов
Разработчики PHPUnit обещают реализацию
многопоточного запуска из коробки?
Вывод: надо разработать что-то своё!
Первое решение – отделим “большие” тесты от “маленьких”
Схема запуска 6.5к тестов 16к тестов 16к тестов,
нагруженные серверы
Однопоточныйзапуск 10 – 15 минут 35 – 40 минут
ОБОЖЕКАКМНОГО
минут
Разделение тестов
поровну 2 – 2.5 минуты 10 – 15 минут 20 – 25 минут
Отделение “больших”
тестов 1.5 – 2 минуты 6 – 8 минут 15 – 20 минут
??? ??? ??? ???
Второе решение – необходимо хранить информацию
о времени работы каждого теста!
Для избежания переизбытка информации
необходим централизованный сбор статистики!
И для этого нам идеально подходит TeamCity!
Лучший способ настройки такой утилиты?
Итоговая схема Многопоточной пускалки
КЛАСС ДЛЯ СБОРА
И СОХРАНЕНИЯ СТАТИСТИКИ
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
КЛАСС ДЛЯ
РАСПРЕДЕЛЕНИЯ ТЕСТОВ
ПО ПОТОКАМ
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯСТАТИСТИКИ
БД TeamCity БД для хранения
статистики
Обработкаинформации
тест => время
файл => время
Поиск соответствия
тест => файл;
Простейшая система
кешированияинформации
для ускорения процесса
КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ
Понедельник Вторник Среда Четверг
Пятница Суббота Воскресенье
7 состояний с накапливаемымиданными
Чем новее статистика – тем больший “вес” она имеет
при распределениитестов
Возрастстатистики Вес статистики
< 1 суток 100
< 2 суток 50
< 3 суток 25
> 3 суток 10
КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ
Длительность тестов
Потоки с уже распределённымитестами
Тест с известной длительностью
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Сбор файлов
с тестами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
Запуск процессов
PHPUnit с нужными
параметрами
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
Запуск процессов
PHPUnit с нужными
параметрами
Вывод информации
с помощью наших
TestListener'ов
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
Запуск процессов
PHPUnit с нужными
параметрами
Вывод информации
с помощью наших
TestListener'ов
Сбор и сохранение
статистики
(если необходимо)
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
Запуск процессов
PHPUnit с нужными
параметрами
Вывод информации
с помощью наших
TestListener'ов
Сбор и сохранение
статистики
(если необходимо)
???
КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ
Чтение входного
XML-файла PHPUnit
Расчёт времени
выполнения тестов
Сбор файлов
с тестами
Распределение
тестов по потокам
Генерация
динамического
XML-конфига
Запуск процессов
PHPUnit с нужными
параметрами
Вывод информации
с помощью наших
TestListener'ов
Сбор и сохранение
статистики
(если необходимо)
???
P R O F I T ! ! !
Кастомные TestListener'ы
Схема запуска 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 минут
Итого мы получили самостоятельно
адаптирующуюся
под обстоятельства систему!
PROFIT
1) Тесты запускаются чаще!
2) Автоматический запуск тестов!
3) Переносимость и конфигурируемость!
4) Going OpenSource – stay tuned!
badoo.com
vk.com/badoocom
fb.com/BadooMoscow
twitter.com/BadooDev
habrahabr.ru/company/badoo/
vk.com/relzeg
fb.com/relzeg

More Related Content

What's hot

практическое задание
практическое заданиепрактическое задание
практическое заданиеolgakort
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandexaviatakz
 
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"Alexander Akbashev
 
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)AvitoTech
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхBadoo Development
 
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков2ГИС Технологии
 
Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Yulia Karpova
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsBadoo Development
 
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)Ontico
 
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Ontico
 
Антон Галицын
Антон ГалицынАнтон Галицын
Антон ГалицынCodeFest
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionPavel Usachev
 
Continuous Integration для C++ разработчика
Continuous Integration для C++ разработчикаContinuous Integration для C++ разработчика
Continuous Integration для C++ разработчикаPavel Filonov
 
Continuous Integration for C++ engineers
Continuous Integration for C++ engineersContinuous Integration for C++ engineers
Continuous Integration for C++ engineerscorehard_by
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET CoreDotNetConf
 

What's hot (18)

практическое задание
практическое заданиепрактическое задание
практическое задание
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
КРИ-2013. "Нагрузочное тестирование или Боты - санитары сервера"
 
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
"Sphinx 3.0 в реальной жизни" Андрей Смирнов (Avito)
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
 
Continuousdelivery
ContinuousdeliveryContinuousdelivery
Continuousdelivery
 
Windw
WindwWindw
Windw
 
Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
 
VMUG UA #1 Veeam BR v6
VMUG UA #1 Veeam BR v6VMUG UA #1 Veeam BR v6
VMUG UA #1 Veeam BR v6
 
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
Релиз инжиниринг Mail.ru, взгляд изнутри / Максим Глеков (Mail.Ru Group)
 
Антон Галицын
Антон ГалицынАнтон Галицын
Антон Галицын
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Continuous Integration для C++ разработчика
Continuous Integration для C++ разработчикаContinuous Integration для C++ разработчика
Continuous Integration для C++ разработчика
 
Continuous Integration for C++ engineers
Continuous Integration for C++ engineersContinuous Integration for C++ engineers
Continuous Integration for C++ engineers
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET Core
 

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

Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)SPB SQA Group
 
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»FDConf
 
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)SPB SQA Group
 
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполнения
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполненияАвтотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполнения
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполненияSQALab
 
5 колчинская
5 колчинская 5 колчинская
5 колчинская qasib
 
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019GoQA
 
Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demandSQALab
 
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14Serguei Gitinsky
 
Автоматизация тестирования на крупных проектах
Автоматизация тестирования на крупных проектахАвтоматизация тестирования на крупных проектах
Автоматизация тестирования на крупных проектахIgor Khrol
 
So Your WAF Needs a Parser
So Your WAF Needs a ParserSo Your WAF Needs a Parser
So Your WAF Needs a Parseryalegko
 
Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Andrei Solntsev
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Paul Stashevsky
 
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...CodeFest
 
Поиск багов в поиске
Поиск багов в поискеПоиск багов в поиске
Поиск багов в поискеyaevents
 

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

10M tests per day
10M tests per day10M tests per day
10M tests per day
 
Parallelization of Selenium tests with .NET/C# + NUnit
Parallelization of Selenium tests with .NET/C# + NUnitParallelization of Selenium tests with .NET/C# + NUnit
Parallelization of Selenium tests with .NET/C# + NUnit
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)"Опыт создания системы управления сборкой и тестированием" (полная)
"Опыт создания системы управления сборкой и тестированием" (полная)
 
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»
«Continuous Integration — A to Z или Непрерывная интеграция — кто всё сломал?»
 
Как работать с legacy проектом, которому больше10 лет? |Денис Воскобойник
Как работать с legacy проектом, которому больше10 лет? |Денис ВоскобойникКак работать с legacy проектом, которому больше10 лет? |Денис Воскобойник
Как работать с legacy проектом, которому больше10 лет? |Денис Воскобойник
 
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
 
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполнения
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполненияАвтотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполнения
Автотестирование АБС. Конвейер разработки, конвейер данных, конвейер выполнения
 
Jmeter
JmeterJmeter
Jmeter
 
5 колчинская
5 колчинская 5 колчинская
5 колчинская
 
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019
АНТОН СЕРПУТЬКО «Start performance testing from scratch» QADay 2019
 
Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demand
 
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
CFEngine, Puppet, Chef, SAltStack and Ansible Failover'14
 
Автоматизация тестирования на крупных проектах
Автоматизация тестирования на крупных проектахАвтоматизация тестирования на крупных проектах
Автоматизация тестирования на крупных проектах
 
So Your WAF Needs a Parser
So Your WAF Needs a ParserSo Your WAF Needs a Parser
So Your WAF Needs a Parser
 
Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)Экономически эффективный процесс тестирования (Codefest 2015)
Экономически эффективный процесс тестирования (Codefest 2015)
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)Разработка и сопровождении авто-тестов (Selenium)
Разработка и сопровождении авто-тестов (Selenium)
 
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...
CodeFest 2011. Левин М. — Фреймворк для автоматизации тестирования и функцион...
 
Поиск багов в поиске
Поиск багов в поискеПоиск багов в поиске
Поиск багов в поиске
 

More from Badoo Development

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationBadoo Development
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUBadoo Development
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерBadoo Development
 
Филипп Уваров, Avito
Филипп Уваров, AvitoФилипп Уваров, Avito
Филипп Уваров, AvitoBadoo Development
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicBadoo Development
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentBadoo Development
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityBadoo Development
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноBadoo Development
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruBadoo Development
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooBadoo Development
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma Badoo Development
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoBadoo Development
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов» Badoo Development
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL Badoo Development
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Badoo Development
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоадаBadoo Development
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кодаBadoo Development
 
Versioning strategy for a complex internal API
Versioning strategy for a complex internal APIVersioning strategy for a complex internal API
Versioning strategy for a complex internal APIBadoo Development
 

More from Badoo Development (20)

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel Automation
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RU
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.Браузер
 
Филипп Уваров, Avito
Филипп Уваров, AvitoФилипп Уваров, Avito
Филипп Уваров, Avito
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magic
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High Availability
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, Badoo
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, Erlyvideo
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада
 
ChromeDriver Jailbreak
ChromeDriver JailbreakChromeDriver Jailbreak
ChromeDriver Jailbreak
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кода
 
Versioning strategy for a complex internal API
Versioning strategy for a complex internal APIVersioning strategy for a complex internal API
Versioning strategy for a complex internal API
 

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

  • 3. Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы Однопоточныйзапуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО минут ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
  • 5. А может, не будем запускать каждый раз все тесты? А может, не будем каждый раз запускать ВСЕ тесты?
  • 6. А может, попробуем поделить тесты вручную?
  • 7. А может, просто напишем утилиту, которая будет делить тесты между потоками поровну?
  • 8. Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы Однопоточныйзапуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО минут Разделение тестов поровну 2 – 2.5 минуты 10 – 15 минут 20 – 25 минут ??? ??? ??? ??? ??? ??? ??? ???
  • 9. Нам необоходимо средство для автоматического и равномерного разделения тестов по потокам
  • 11. И почти всё что мы нашли – реализация уже отвергнутых нами методов
  • 12. Оригинальный метод – несколько процессов“разгребают” общую очередь тестов
  • 13. Разработчики PHPUnit обещают реализацию многопоточного запуска из коробки?
  • 15. Первое решение – отделим “большие” тесты от “маленьких”
  • 16. Схема запуска 6.5к тестов 16к тестов 16к тестов, нагруженные серверы Однопоточныйзапуск 10 – 15 минут 35 – 40 минут ОБОЖЕКАКМНОГО минут Разделение тестов поровну 2 – 2.5 минуты 10 – 15 минут 20 – 25 минут Отделение “больших” тестов 1.5 – 2 минуты 6 – 8 минут 15 – 20 минут ??? ??? ??? ???
  • 17. Второе решение – необходимо хранить информацию о времени работы каждого теста!
  • 18. Для избежания переизбытка информации необходим централизованный сбор статистики!
  • 19. И для этого нам идеально подходит TeamCity!
  • 20. Лучший способ настройки такой утилиты?
  • 21. Итоговая схема Многопоточной пускалки КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ
  • 22. КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯСТАТИСТИКИ БД TeamCity БД для хранения статистики Обработкаинформации тест => время файл => время Поиск соответствия тест => файл; Простейшая система кешированияинформации для ускорения процесса
  • 23. КЛАСС ДЛЯ СБОРА И СОХРАНЕНИЯ СТАТИСТИКИ Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье 7 состояний с накапливаемымиданными Чем новее статистика – тем больший “вес” она имеет при распределениитестов Возрастстатистики Вес статистики < 1 суток 100 < 2 суток 50 < 3 суток 25 > 3 суток 10
  • 24. КЛАСС ДЛЯ РАСПРЕДЕЛЕНИЯ ТЕСТОВ ПО ПОТОКАМ Длительность тестов Потоки с уже распределённымитестами Тест с известной длительностью
  • 25. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit
  • 26. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Сбор файлов с тестами
  • 27. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами
  • 28. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам
  • 29. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига
  • 30. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига Запуск процессов PHPUnit с нужными параметрами
  • 31. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига Запуск процессов PHPUnit с нужными параметрами Вывод информации с помощью наших TestListener'ов
  • 32. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига Запуск процессов PHPUnit с нужными параметрами Вывод информации с помощью наших TestListener'ов Сбор и сохранение статистики (если необходимо)
  • 33. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига Запуск процессов PHPUnit с нужными параметрами Вывод информации с помощью наших TestListener'ов Сбор и сохранение статистики (если необходимо) ???
  • 34. КЛАСС ДЛЯ ЗАПУСКА ТЕСТОВ Чтение входного XML-файла PHPUnit Расчёт времени выполнения тестов Сбор файлов с тестами Распределение тестов по потокам Генерация динамического XML-конфига Запуск процессов PHPUnit с нужными параметрами Вывод информации с помощью наших TestListener'ов Сбор и сохранение статистики (если необходимо) ??? P R O F I T ! ! !
  • 36. Схема запуска 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 минут
  • 37. Итого мы получили самостоятельно адаптирующуюся под обстоятельства систему!
  • 38. PROFIT 1) Тесты запускаются чаще! 2) Автоматический запуск тестов! 3) Переносимость и конфигурируемость! 4) Going OpenSource – stay tuned!