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

Post on 14-Jun-2015

460 views 0 download

Tags:

description

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

transcript

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

ПРОЕКТЕ Кудинов Илья, 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