SlideShare a Scribd company logo
1 of 46
Download to read offline
Тестирование в компании  Дмитрий Зенович
Начальные условия Десятки типов онлайн демонов на C++ Десятки  offline  скриптов на  PHP  и демонов на C++ веб-интерфейс API генераторы статистики и отчетов Объем кода – несколько сотен тысяч строк
Начальные условия Что хотелось сделать: •  сократить время итерации и увеличить продуктивность разработки •  создать отдел тестирования (тестирование проводилось силами разработчиков) •  увеличить полноту документации •  оптимизировать процесс внедрения в  PHP -разработке
Часть 1 Тестирование
Начало тестирования Ставка на  автоматизированное тестирование . Выбор в качестве фреймворка для автоматизированного тестирования  PHPUnit Стандарты кодирования . Один класс в файле. Мэппинг имени класса в имя файла. Непрерывный рефакторинг. Переписывать все непонятное, упрощать все сложное, избавляться от дублирования.
Библиотека  / ConfigurableObject ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Библиотека  / ConfigurableObject Защищенные свойства /** * @property * @var string */ protected  $readOnly ; protected  function  _setReadOnly ( $value )   { throw … } protected  function  _getReadOnly ()   {   return   1 ;   }
Библиотека  / ConfigurableObject Сериализация :  toArray() ,  __toString() Сериализация в XML @serializeXmlAs  node(имя)|attribute|text|cdata|none   @serializeXmlAs  node( имя ) в  заголовке класса $obj  =  Testlib_ConfigurableObject :: fromXml ( 'XmlObj' , $xmlString ) ; $obj-> to Xml ( )  ; Другие виды сериализации Внутренние  форматы  сериализации, JSON,  HTML , …
Библиотека  / ConfigurableObject /** * @serializeXmlAs node(begun) */ class  Testlib_Client_Daemon_Response_Banner_Body_Begun  extends  Testlib_ConfigurableObject   { /** * @var  Testlib_Client_Daemon_Response_Banner_Body_Begun_Banner [] */ public  $banner   =   array () ; } $obj   =   Testlib_ConfigurableObject :: fromXml ( ' Testlib_Client_Daemon_Response_Banner_Body_Begun ' ,   $data ) ;
Библиотека  / MethodMock Testlib_MethodMock Изоляция тестируемого функционала Предотвращение лишних действий Предотвращение долгих операций в тестах (БД и т.п.) Упрощение подготовки начальной конфигурации PECL- модуль   runkit  (runkit_method_copy, runkit_method_redefine, runkit_method_remove, …) Перехват встроенных функций PHP Патчи  runkit
Библиотека  / MethodMock $ m 1   =   Testlib_MethodMock :: interceptMethodByCode ( "MyClass" , "myMethod" ,   "echo ' 1 ';" ) ; $ m2   =  Testlib_MethodMock :: mockFunctionResult ( 'getValue' , 12345 ,   array ( 2 , 1 )) ; $ m3   =  Testlib_MethodMock :: interceptMethodByCode ( "MyClass" , "myMethod" ,   "echo 'called';" ) ; $ m1 -> getCalledArgs () ; $ m2 -> getCalledResults () ; $ m3 -> isCalled () ; $ m1 -> countCalled () ; $m 2 -> resetCallStack () ; $m 3 -> revert () ;
Библиотека  / TcpdumpCatcher Testlib_TcpdumpCatcher $catcher   =   new  Testlib_TcpdumpCatcher ( TESTLAB_HOST ,  TESTLAB_USER ,   TESTLAB_PASS ,   "192.168.1.3" ,   "8080" ,   "eth0" ) ; // ... $dump   =   $catcher -> finish () ; Внутри:  tcpdump , анализ собранных пакетов, склеивание с учетом фрагментирования, парсинг Работает локально или удаленно
Библиотека  / LogCatcher Testlib_LogCatcher $catcher   =   new  Testlib_LogCatcher ( "my.log" ,   /* "192.168.1.3" ,   "myuser" ,   "123456“ */ ) ; // ...   $log   =   $catcher -> finish () ; Внутри:  wc -l , tail -n  Работает локально или удаленно
Работа с базой данных ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Библиотека  / DatabaseMock Testlib_DatabaseMock $dbMock   =  new Testlib_DatabaseMock ( 'Cards' ,   'CardsForTest' , false ,   array ( 'CatalogTree' ,   'CatalogInfo' )) ;   //  ... $dbMock -> revert () ;   Внутри : Testlib_MethodMock::interceptFunction('mysql_query'); runkit_constant_redefine (…) Различные способы экранирования имен таблиц и баз учитываются
Библиотека  / DbiCleaner Testlib_D biCleaner $dbMock   =  new Testlib_DatabaseMock ( 'Cards' ,   'CardsForTest' , false ,   array ( 'CatalogTree' ,   'CatalogInfo' )) ;   //  ... $dbMock -> revert () ;   Внутри : MethodMock::interceptFunction('mysql_query'); runkit_constant_redefine (…) Различные способы экранирования имен таблиц и баз учитываются
Библиотека  / FakeDaemon Testlib_ FakeDaemon Подмена ответов.  nginx + php.  Настройка  ini- файла: [:7099] serviceNam e="4test" port =80 host ="lab128" logfile ="./7099-4tests.log " Подмена ответа: Testlib_FakeDaemon :: setCustomResponse ( '4test' , $requestText , $responseText ) ;
Библиотека  / FakeDaemon $ responseText  может не содержать  HTTP -заголовков $requestText может быть  неполным  текстом запроса Внутри   подмены : Testlib_FakeDeamon_CustomResponse::fromRequestAndResponse() Создаются условия по  requestMethod ,  handler , каждому  get -параметру , по каждому  заголовку , кроме « Host ».  Порядок полей не важен. Ответ и его условия сохраняются в базу и заносятся в DbiCleaner
Библиотека  / FakeDaemon ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Создание клиента  daemon’ а Базовый класс ( Testlib_ClientTest ) Работа с  конфигом  демона в БД (получение, изменение) Абстрактный  http- запрос  к демону Абстрактный  http-запрос  к демону  для тестов  ( конфиг, лог, подмена ответов других демонов,  TcpdumpCatcher , контроль изоляции демона, поиск ошибок в логе) Запуск и остановка демона , запущен ли демон, ожидание запуска requestHandler , requestHandlerForTests   ( Testlib_ConfigurableObject )
Создание клиента  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 ) для входных и выходных данных хэндлеров
Создание клиента  daemon’ а Написание тестов демонов $params   =   array ( 'params'   =>  array (   'getParams'   =>   array ( ... ) ,  ... ) , 'tcpdump'   =>   array ( ... ) , 'customResponses'   =>   array ( Testlib_FakeDaemon_CustomResponse :: fromRequestAndResponse ( 'subdaemon' ,   '/handler' ,   ( string )   (string)  new   Testlib_Client_Subdaemon_Response_Handler_Body ( ... ) ) ,   ... ) ) ; $result   =  Testlib_Client_Daemon :: requestIndexForTests ( $params ) ;
Библиотека Базовые классы тестов и сьютов демонов Testlib _ TestSuite  остановка и возобновление репликации prepare/clean up CommonSuite  (много тестов для одного запроса к демону)
Тестирование  PHP Можно использовать библиотеки PHP-разработчиков Методы белого ящика Написание юнит-тестов PHP Базовый   кла c с  Testlib_TestCase_Php Блокирование коммита  БД C тарт транзакции в setUp, откат в  tearDown Очистка глобальных объектов Список sql-запросов в отчетах об ошибке Отслеживание коммитов и роллбэков Проблема  parent::setUp  и  parent::tearDown
Тестирование  PHP Testlib_ScriptRunner Возвращать результат, вывод,  log  скрипта Умеет дожидаться освобождения  lock -файла run S cript () runScriptByIncluding () удаляет константы, определенные в скрипте удаляет функции, определенные в скрипте неправильное окружение, зато есть возможность подменять методы, базы, откатывать   транзакцию
Тестирование  web- интерфейса Доработки PHPUnit в части работы с  Selenium Более подробный отчет об ошибке Добавлены: URL  страницы,  скриншот , HTML- source ,  история команд   Selenium , лог запросов  БД , отчет об ошибке в формате  HTML Переписан драйвер работы с Selenium-RC Исправление  HTTP ( Ускорение  > 10 раз) Перекодировка запросов и ответов Отмена автоматического закрытия окна браузера при ошибках
Тестирование  web- интерфейса Общий подход:  Testlib _ TestCase _ Selenium , ускорение авторизации Использовать Selenium как можно меньше!   Удаленный перехват методов и функций  PHP Оболочка MethodMock для  удаленного перехвата . Принцип работы: sessionId, Zend_Cache
Тестирование  JavaScript Testlib_TestCase_J sBlock Подмена в браузере настраиваемый прокси для подмены ответов демонов и статических файлов веб-нитерфейс для управлениями правилами
Виртуальные стенды ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Виртуальные стенды ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Виртуальные стенды ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Виртуальные стенды Список виртуальных машин: xm list Остановка/восстановление: xm start/destroy Удаление: php  / begun / www / teststand / deleteLab . php Важно: база данных должна содержать только минимальный набор данных, необходимых для работы программы и тестов.
Непрерывная интеграция ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Непрерывная интеграция ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Конец первой части
Часть 2 Нагрузочное тестирование
Нагрузочное тестирование Минусы тестовой среды: - Проблематичность создания адекватной нагрузки - Трудности в повторении среды production (железо, сеть, …) - Необходимость в интегральном подходе (связанные демона и базы) - Необходимость в системах мониторинга - Необходимость в специалистах по нагрузочному тестированию После функционального тестирования задача передается в нагрузочное тестирование.
Нагрузочное тестирование ,[object Object],[object Object],[object Object],[object Object],[object Object]
Нагрузочное тестирование Тестирование новых версий Выведение машины из production Установка на машину новой версии Дублирование трафика с production-машины (%) Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Оценивается динамика нагрузки на «нижние» подсистемы
Нагрузочное тестирование Стресс-тестирование старых версий Постепенное увеличение нагрузки (>100%) Мониторинг кол-ва ошибочных ответов и времени ответа Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Мониторинг нагрузки на failover-машину Изучение логов балансера (время ответа) Комплексная оценка производительности
Конец второй части
Часть 3 Эпилог
Тестирование улучшает климат ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Результаты и будущее  Подробная документация Внедрение проверенного кода Стабильная и предсказуемая разработка Выполнение месячных планов Сбор и анализ формализованных отчетов об ошибке
Ссылки +  литература 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) Дастин, Э. Автоматизированное тестирование программного обеспечения: пер. с англ. / Э. Дастин, Дж. Рэшка, Дж. Пол
СПАСИБО! Дмитрий Зенович, руководитель отдела тестирования E-mail:  dzenovich@ begun.ru

More Related Content

What's hot

Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Moscow.pm
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровPositive Hack Days
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладSQALab
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"QA Dnepropetrovsk Community (Ukraine)
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3 phpclub
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7Technopark
 

What's hot (20)

Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский доклад
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
file handling in c
file handling in cfile handling in c
file handling in c
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
About Python
About PythonAbout Python
About Python
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
 

Viewers also liked

Servicios De Internet
Servicios De InternetServicios De Internet
Servicios De Internetvalesaka87
 
Special Report Bulletin
Special Report BulletinSpecial Report Bulletin
Special Report Bulletinjkmullis
 
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...Jonatas Ferreira
 
Mucha poesía, poca difusión
Mucha poesía, poca difusiónMucha poesía, poca difusión
Mucha poesía, poca difusiónOdette Cf
 
Accident At Russias Biggest Hydroelectric Rev 00
Accident At Russias Biggest Hydroelectric   Rev 00Accident At Russias Biggest Hydroelectric   Rev 00
Accident At Russias Biggest Hydroelectric Rev 00guestdff6c6ec
 
Private cloud vendors
Private cloud vendorsPrivate cloud vendors
Private cloud vendorssanjayhora
 
Güzellikler
GüzelliklerGüzellikler
Güzelliklerorhan
 
Catalogo Cooperativa Compraventa Montijo 2008 2009
Catalogo Cooperativa Compraventa Montijo 2008 2009Catalogo Cooperativa Compraventa Montijo 2008 2009
Catalogo Cooperativa Compraventa Montijo 2008 2009chema martin
 
Derecho Informático
Derecho InformáticoDerecho Informático
Derecho InformáticoFelipe Rojas
 
EVALUACIÓN DE LA INFORMACIÓN
EVALUACIÓN DE LA INFORMACIÓNEVALUACIÓN DE LA INFORMACIÓN
EVALUACIÓN DE LA INFORMACIÓNmariajmp
 

Viewers also liked (20)

Servicios De Internet
Servicios De InternetServicios De Internet
Servicios De Internet
 
Special Report Bulletin
Special Report BulletinSpecial Report Bulletin
Special Report Bulletin
 
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...
Baja 2013 08._proposta_de_alteracao_rbsb_-_formato_de_entrega_de_relatórios_-...
 
Eleman Seçme
Eleman SeçmeEleman Seçme
Eleman Seçme
 
Mucha poesía, poca difusión
Mucha poesía, poca difusiónMucha poesía, poca difusión
Mucha poesía, poca difusión
 
Olores, olores...
Olores, olores...Olores, olores...
Olores, olores...
 
Accident At Russias Biggest Hydroelectric Rev 00
Accident At Russias Biggest Hydroelectric   Rev 00Accident At Russias Biggest Hydroelectric   Rev 00
Accident At Russias Biggest Hydroelectric Rev 00
 
Isset Presentation @ EECI2009
Isset Presentation @ EECI2009Isset Presentation @ EECI2009
Isset Presentation @ EECI2009
 
Slides Upf2010 SesióN 2 Public
Slides Upf2010 SesióN 2 PublicSlides Upf2010 SesióN 2 Public
Slides Upf2010 SesióN 2 Public
 
Analytics ROI
Analytics ROIAnalytics ROI
Analytics ROI
 
Slides Upf2010 SesióN #4
Slides Upf2010 SesióN #4Slides Upf2010 SesióN #4
Slides Upf2010 SesióN #4
 
Ics patrones-20130820
Ics patrones-20130820Ics patrones-20130820
Ics patrones-20130820
 
Mirianyili traduccion inges...
Mirianyili traduccion inges...Mirianyili traduccion inges...
Mirianyili traduccion inges...
 
Private cloud vendors
Private cloud vendorsPrivate cloud vendors
Private cloud vendors
 
Güzellikler
GüzelliklerGüzellikler
Güzellikler
 
Masrawy - EditorsLab Cairo
Masrawy - EditorsLab CairoMasrawy - EditorsLab Cairo
Masrawy - EditorsLab Cairo
 
Catalogo Cooperativa Compraventa Montijo 2008 2009
Catalogo Cooperativa Compraventa Montijo 2008 2009Catalogo Cooperativa Compraventa Montijo 2008 2009
Catalogo Cooperativa Compraventa Montijo 2008 2009
 
YouTube Story
YouTube StoryYouTube Story
YouTube Story
 
Derecho Informático
Derecho InformáticoDerecho Informático
Derecho Informático
 
EVALUACIÓN DE LA INFORMACIÓN
EVALUACIÓN DE LA INFORMACIÓNEVALUACIÓN DE LA INFORMACIÓN
EVALUACIÓN DE LA INFORMACIÓN
 

Similar to бегун

2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиSQALab
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Fedor Malyshkin
 

Similar to бегун (20)

PowerShell
PowerShellPowerShell
PowerShell
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 

More from HighLoad2009

Eremkin Cboss Smsc Hl2009
Eremkin Cboss Smsc Hl2009Eremkin Cboss Smsc Hl2009
Eremkin Cboss Smsc Hl2009HighLoad2009
 
Hl++2009 Ayakovlev Pochta
Hl++2009 Ayakovlev PochtaHl++2009 Ayakovlev Pochta
Hl++2009 Ayakovlev PochtaHighLoad2009
 
архитектура новой почты рамблера
архитектура новой почты рамблераархитектура новой почты рамблера
архитектура новой почты рамблераHighLoad2009
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
Highload Perf Tuning
Highload Perf TuningHighload Perf Tuning
Highload Perf TuningHighLoad2009
 
особенности использования Times Ten In Memory Database в высоконагруженной среде
особенности использования Times Ten In Memory Database в высоконагруженной средеособенности использования Times Ten In Memory Database в высоконагруженной среде
особенности использования Times Ten In Memory Database в высоконагруженной средеHighLoad2009
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHighLoad2009
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9HighLoad2009
 

More from HighLoad2009 (20)

Krizhanovsky Vm
Krizhanovsky VmKrizhanovsky Vm
Krizhanovsky Vm
 
Eremkin Cboss Smsc Hl2009
Eremkin Cboss Smsc Hl2009Eremkin Cboss Smsc Hl2009
Eremkin Cboss Smsc Hl2009
 
Ddos
DdosDdos
Ddos
 
Kosmodemiansky
KosmodemianskyKosmodemiansky
Kosmodemiansky
 
Scalaxy
ScalaxyScalaxy
Scalaxy
 
Hl++2009 Ayakovlev Pochta
Hl++2009 Ayakovlev PochtaHl++2009 Ayakovlev Pochta
Hl++2009 Ayakovlev Pochta
 
Why02
Why02Why02
Why02
 
архитектура новой почты рамблера
архитектура новой почты рамблераархитектура новой почты рамблера
архитектура новой почты рамблера
 
Quick Wins
Quick WinsQuick Wins
Quick Wins
 
Take2
Take2Take2
Take2
 
Hl2009 1c Bitrix
Hl2009 1c BitrixHl2009 1c Bitrix
Hl2009 1c Bitrix
 
Php Daemon
Php DaemonPhp Daemon
Php Daemon
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Highload Perf Tuning
Highload Perf TuningHighload Perf Tuning
Highload Perf Tuning
 
Hl2009 Pr V2
Hl2009 Pr V2Hl2009 Pr V2
Hl2009 Pr V2
 
Highload2009
Highload2009Highload2009
Highload2009
 
особенности использования Times Ten In Memory Database в высоконагруженной среде
особенности использования Times Ten In Memory Database в высоконагруженной средеособенности использования Times Ten In Memory Database в высоконагруженной среде
особенности использования Times Ten In Memory Database в высоконагруженной среде
 
Hl Nekoval
Hl NekovalHl Nekoval
Hl Nekoval
 
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus ReadyHigh Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus Ready
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9
 

бегун

  • 1. Тестирование в компании Дмитрий Зенович
  • 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 , …
  • 9. Библиотека / ConfigurableObject /** * @serializeXmlAs node(begun) */ class Testlib_Client_Daemon_Response_Banner_Body_Begun extends Testlib_ConfigurableObject { /** * @var Testlib_Client_Daemon_Response_Banner_Body_Begun_Banner [] */ public $banner = array () ; } $obj = Testlib_ConfigurableObject :: fromXml ( ' Testlib_Client_Daemon_Response_Banner_Body_Begun ' , $data ) ;
  • 10. Библиотека / MethodMock Testlib_MethodMock Изоляция тестируемого функционала Предотвращение лишних действий Предотвращение долгих операций в тестах (БД и т.п.) Упрощение подготовки начальной конфигурации PECL- модуль runkit (runkit_method_copy, runkit_method_redefine, runkit_method_remove, …) Перехват встроенных функций PHP Патчи runkit
  • 11. Библиотека / MethodMock $ m 1 = Testlib_MethodMock :: interceptMethodByCode ( &quot;MyClass&quot; , &quot;myMethod&quot; , &quot;echo ' 1 ';&quot; ) ; $ m2 = Testlib_MethodMock :: mockFunctionResult ( 'getValue' , 12345 , array ( 2 , 1 )) ; $ m3 = Testlib_MethodMock :: interceptMethodByCode ( &quot;MyClass&quot; , &quot;myMethod&quot; , &quot;echo 'called';&quot; ) ; $ m1 -> getCalledArgs () ; $ m2 -> getCalledResults () ; $ m3 -> isCalled () ; $ m1 -> countCalled () ; $m 2 -> resetCallStack () ; $m 3 -> revert () ;
  • 12. Библиотека / TcpdumpCatcher Testlib_TcpdumpCatcher $catcher = new Testlib_TcpdumpCatcher ( TESTLAB_HOST , TESTLAB_USER , TESTLAB_PASS , &quot;192.168.1.3&quot; , &quot;8080&quot; , &quot;eth0&quot; ) ; // ... $dump = $catcher -> finish () ; Внутри: tcpdump , анализ собранных пакетов, склеивание с учетом фрагментирования, парсинг Работает локально или удаленно
  • 13. Библиотека / LogCatcher Testlib_LogCatcher $catcher = new Testlib_LogCatcher ( &quot;my.log&quot; , /* &quot;192.168.1.3&quot; , &quot;myuser&quot; , &quot;123456“ */ ) ; // ... $log = $catcher -> finish () ; Внутри: wc -l , tail -n Работает локально или удаленно
  • 14.
  • 15. Библиотека / DatabaseMock Testlib_DatabaseMock $dbMock = new Testlib_DatabaseMock ( 'Cards' , 'CardsForTest' , false , array ( 'CatalogTree' , 'CatalogInfo' )) ; // ... $dbMock -> revert () ; Внутри : Testlib_MethodMock::interceptFunction('mysql_query'); runkit_constant_redefine (…) Различные способы экранирования имен таблиц и баз учитываются
  • 16. Библиотека / DbiCleaner Testlib_D biCleaner $dbMock = new Testlib_DatabaseMock ( 'Cards' , 'CardsForTest' , false , array ( 'CatalogTree' , 'CatalogInfo' )) ; // ... $dbMock -> revert () ; Внутри : MethodMock::interceptFunction('mysql_query'); runkit_constant_redefine (…) Различные способы экранирования имен таблиц и баз учитываются
  • 17. Библиотека / FakeDaemon Testlib_ FakeDaemon Подмена ответов. nginx + php. Настройка ini- файла: [:7099] serviceNam e=&quot;4test&quot; port =80 host =&quot;lab128&quot; logfile =&quot;./7099-4tests.log &quot; Подмена ответа: Testlib_FakeDaemon :: setCustomResponse ( '4test' , $requestText , $responseText ) ;
  • 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 ) для входных и выходных данных хэндлеров
  • 22. Создание клиента daemon’ а Написание тестов демонов $params = array ( 'params' => array ( 'getParams' => array ( ... ) , ... ) , 'tcpdump' => array ( ... ) , 'customResponses' => array ( Testlib_FakeDaemon_CustomResponse :: fromRequestAndResponse ( 'subdaemon' , '/handler' , ( string ) (string) new Testlib_Client_Subdaemon_Response_Handler_Body ( ... ) ) , ... ) ) ; $result = Testlib_Client_Daemon :: requestIndexForTests ( $params ) ;
  • 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 Важно: база данных должна содержать только минимальный набор данных, необходимых для работы программы и тестов.
  • 33.
  • 34.
  • 36. Часть 2 Нагрузочное тестирование
  • 37. Нагрузочное тестирование Минусы тестовой среды: - Проблематичность создания адекватной нагрузки - Трудности в повторении среды production (железо, сеть, …) - Необходимость в интегральном подходе (связанные демона и базы) - Необходимость в системах мониторинга - Необходимость в специалистах по нагрузочному тестированию После функционального тестирования задача передается в нагрузочное тестирование.
  • 38.
  • 39. Нагрузочное тестирование Тестирование новых версий Выведение машины из production Установка на машину новой версии Дублирование трафика с production-машины (%) Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Оценивается динамика нагрузки на «нижние» подсистемы
  • 40. Нагрузочное тестирование Стресс-тестирование старых версий Постепенное увеличение нагрузки (>100%) Мониторинг кол-ва ошибочных ответов и времени ответа Мониторинг нагрузки на подсистемы самой машины (диск, CPU, сеть) и времени ответа Мониторинг логов тестируемого демона Мониторинг нагрузки на failover-машину Изучение логов балансера (время ответа) Комплексная оценка производительности
  • 43.
  • 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) Дастин, Э. Автоматизированное тестирование программного обеспечения: пер. с англ. / Э. Дастин, Дж. Рэшка, Дж. Пол
  • 46. СПАСИБО! Дмитрий Зенович, руководитель отдела тестирования E-mail: dzenovich@ begun.ru