2. Начальные условия Десятки типов онлайн демонов на C++ Десятки offline скриптов на PHP и демонов на C++ веб-интерфейс API генераторы статистики и отчетов Объем кода – несколько сотен тысяч строк
3. Начальные условия Что хотелось сделать: • сократить время итерации и увеличить продуктивность разработки • создать отдел тестирования (тестирование проводилось силами разработчиков) • увеличить полноту документации • оптимизировать процесс внедрения в PHP -разработке
5. Начало тестирования Ставка на автоматизированное тестирование . Выбор в качестве фреймворка для автоматизированного тестирования PHPUnit Стандарты кодирования . Один класс в файле. Мэппинг имени класса в имя файла. Непрерывный рефакторинг. Переписывать все непонятное, упрощать все сложное, избавляться от дублирования.
6.
7. Библиотека / ConfigurableObject Защищенные свойства /** * @property * @var string */ protected $readOnly ; protected function _setReadOnly ( $value ) { throw … } protected function _getReadOnly () { return 1 ; }
8. Библиотека / ConfigurableObject Сериализация : toArray() , __toString() Сериализация в XML @serializeXmlAs node(имя)|attribute|text|cdata|none @serializeXmlAs node( имя ) в заголовке класса $obj = Testlib_ConfigurableObject :: fromXml ( 'XmlObj' , $xmlString ) ; $obj-> to Xml ( ) ; Другие виды сериализации Внутренние форматы сериализации, JSON, HTML , …
18. Библиотека / FakeDaemon $ responseText может не содержать HTTP -заголовков $requestText может быть неполным текстом запроса Внутри подмены : Testlib_FakeDeamon_CustomResponse::fromRequestAndResponse() Создаются условия по requestMethod , handler , каждому get -параметру , по каждому заголовку , кроме « Host ». Порядок полей не важен. Ответ и его условия сохраняются в базу и заносятся в DbiCleaner
19.
20. Создание клиента daemon’ а Базовый класс ( Testlib_ClientTest ) Работа с конфигом демона в БД (получение, изменение) Абстрактный http- запрос к демону Абстрактный http-запрос к демону для тестов ( конфиг, лог, подмена ответов других демонов, TcpdumpCatcher , контроль изоляции демона, поиск ошибок в логе) Запуск и остановка демона , запущен ли демон, ожидание запуска requestHandler , requestHandlerForTests ( Testlib_ConfigurableObject )
21. Создание клиента daemon’ а Новый клиент Создаем новый класс ; прописываем в свойствах имя демона, таблицу с конфигом, «нижние» демона ; реализуем методы для каждого хэндлера : /** * @param mixed<Testlib_Client_Daemon_RequestParamsForTests_Index> $params * @return Testlib_Client_Daemon_ResponseForTests_ Index */ public static function requestIndexForTests ( $params = array ()) { return self :: requestHandlerForTests ( 'index' , $params ) ; } создаем классы ( Testlib _ ConfigurableObject ) для входных и выходных данных хэндлеров
23. Библиотека Базовые классы тестов и сьютов демонов Testlib _ TestSuite остановка и возобновление репликации prepare/clean up CommonSuite (много тестов для одного запроса к демону)
24. Тестирование PHP Можно использовать библиотеки PHP-разработчиков Методы белого ящика Написание юнит-тестов PHP Базовый кла c с Testlib_TestCase_Php Блокирование коммита БД C тарт транзакции в setUp, откат в tearDown Очистка глобальных объектов Список sql-запросов в отчетах об ошибке Отслеживание коммитов и роллбэков Проблема parent::setUp и parent::tearDown
25. Тестирование PHP Testlib_ScriptRunner Возвращать результат, вывод, log скрипта Умеет дожидаться освобождения lock -файла run S cript () runScriptByIncluding () удаляет константы, определенные в скрипте удаляет функции, определенные в скрипте неправильное окружение, зато есть возможность подменять методы, базы, откатывать транзакцию
26. Тестирование web- интерфейса Доработки PHPUnit в части работы с Selenium Более подробный отчет об ошибке Добавлены: URL страницы, скриншот , HTML- source , история команд Selenium , лог запросов БД , отчет об ошибке в формате HTML Переписан драйвер работы с Selenium-RC Исправление HTTP ( Ускорение > 10 раз) Перекодировка запросов и ответов Отмена автоматического закрытия окна браузера при ошибках
27. Тестирование web- интерфейса Общий подход: Testlib _ TestCase _ Selenium , ускорение авторизации Использовать Selenium как можно меньше! Удаленный перехват методов и функций PHP Оболочка MethodMock для удаленного перехвата . Принцип работы: sessionId, Zend_Cache
28. Тестирование JavaScript Testlib_TestCase_J sBlock Подмена в браузере настраиваемый прокси для подмены ответов демонов и статических файлов веб-нитерфейс для управлениями правилами
29.
30.
31.
32. Виртуальные стенды Список виртуальных машин: xm list Остановка/восстановление: xm start/destroy Удаление: php / begun / www / teststand / deleteLab . php Важно: база данных должна содержать только минимальный набор данных, необходимых для работы программы и тестов.
37. Нагрузочное тестирование Минусы тестовой среды: - Проблематичность создания адекватной нагрузки - Трудности в повторении среды production (железо, сеть, …) - Необходимость в интегральном подходе (связанные демона и базы) - Необходимость в системах мониторинга - Необходимость в специалистах по нагрузочному тестированию После функционального тестирования задача передается в нагрузочное тестирование.
38.
39. Нагрузочное тестирование Тестирование новых версий Выведение машины из production Установка на машину новой версии Дублирование трафика с production-машины (%) Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Оценивается динамика нагрузки на «нижние» подсистемы
40. Нагрузочное тестирование Стресс-тестирование старых версий Постепенное увеличение нагрузки (>100%) Мониторинг кол-ва ошибочных ответов и времени ответа Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Мониторинг нагрузки на failover-машину Изучение логов балансера (время ответа) Комплексная оценка производительности
44. Результаты и будущее Подробная документация Внедрение проверенного кода Стабильная и предсказуемая разработка Выполнение месячных планов Сбор и анализ формализованных отчетов об ошибке
45. Ссылки + литература PHP: http:// php.net / PHPUnit: http:// phpunit.de / phpUnderControl: http:// phpundercontrol.org / Selenium: http :// seleniumhq.org / runkit: http:// pecl.php.net/package/runkit Extending and Embedding PHP by Sara Golemon Мессарош, Дж. Шаблоны тестирования xUnit: рефакторинг кода тестов (XUnit Test Patterns: Refactoring Test Code) Дастин, Э. Автоматизированное тестирование программного обеспечения: пер. с англ. / Э. Дастин, Дж. Рэшка, Дж. Пол