НАГРУЗОЧНОЕ ТЕСТИРОВАНИЕ ВЕБ-ПРИЛОЖЕНИЙ С ПОМОЩЬЮ  THE GRINDER
СОДЕРЖАНИЕ <ul><li>Нужен ли нам  The Grinder ? </li></ul><ul><li>Метрики и  web </li></ul><ul><li>The Grinder . Знакомство...
НУЖНО ЛИ ТЕСТИРОВАНИЕ ПРОИЗВОДИТЕЛЬНОСТИ В НЕБОЛЬШИХ ПРОЕКТАХ? <ul><li>Например, предполагается максимум 40-50 пользовател...
МЕТРИКИ. ОБЗОР <ul><li>Загрузка процессора </li></ul><ul><li>Загрузка памяти </li></ul><ul><li>Особые показатели сервера п...
МЕТРИКИ.  WEB <ul><li>Загрузка процессора </li></ul><ul><li>Загрузка памяти </li></ul><ul><li>Особые показатели сервера пр...
THE GRINDER . РЕЗЮМЕ <ul><li>100% Java ( любая ОС с поддержкой  J2SE) </li></ul><ul><li>Протоколы  </li></ul><ul><ul><li>H...
THE GRINDER.  СТРУКТУРА <ul><li>Консоль ( Console ) </li></ul><ul><li>Агент ( Agent ) </li></ul><ul><ul><li>Работник ( Wor...
THE GRINDER.  ВИД КОНСОЛИ
THE GRINDER.  ВИД КОНСОЛИ
THE GRINDER.  ВИД КОНСОЛИ
THE GRINDER.  ВИД КОНСОЛИ
THE GRINDER.  ВИД АГЕНТА <ul><li>В рабочей директории Агент создает папку с файлами, переданными консолью (ИМЯ_КОМПЬЮТЕРА ...
THE GRINDER.  СТРУКТУРА <ul><li>Консоль ( Console ) </li></ul><ul><li>Агент ( Agent ) </li></ul><ul><ul><li>Работник ( Wor...
THE GRINDER.  КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li...
THE GRINDER.  КОНФИГУРАЦИЯ <ul><li>grinder. processes </li></ul><ul><li>grinder. threads </li></ul><ul><li>grinder. runs <...
THE GRINDER.  КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li...
THE GRINDER.  КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li...
THE GRINDER.  УСТАНОВКА <ul><li>Java -машина установлена  (проверим:  java . Если нет, скачаем  http://www.java.com/ru/dow...
THE GRINDER.  ЗАПИСЬ СКРИПТА <ul><li>Выполним команду или запустим  bat/shell :  </li></ul><ul><ul><li>java –cp  МЕСТО _ К...
THE GRINDER.  ЗАПУСК ТЕСТОВ
THE GRINDER.  ЗАПУСК ТЕСТОВ <ul><li>В рабочей директории Агент записывает лог-файлы :   </li></ul><ul><li>out_ ИМЯ_КОМПЬЮТ...
THE GRINDER.  ЗАПУСК ТЕСТОВ. ЛОГИ <ul><li>Сохранить статистику в консоли можно </li></ul><ul><li>Получить динамику нельзя ...
GRINDERANALYZER . АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ <ul><li>Запускаем  grinderAnalyzer:  jython run.py &quot; Путь data_ К...
GRINDERANALYZER . АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ <ul><li>При совпадении графиков для некоторых запросов сравниваем, не ...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>Jython:  синтакси c   Python +  библиотеки  Java </li></ul><ul><li>Каждый поток незав...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>Удалите запросы со статичными картинками,  CSS, JS  и т.п. – тестируйте серверную лог...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>Замените получившиеся при записи времена задержки на более адекватные </li></ul><ul><...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>Test  – это объект-обертка, «оборачиваемая»  test.wrap(Object)  вокруг любого тестиру...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>HTTPPlugin -  объект, основная задача которого собирать посредством  httpUtilities Co...
THE GRINDER.  РАЗБОР СКРИПТА <ul><li>NVPair -  объект, создающий пару заголовок-значение.  </li></ul><ul><li>Эта пара пото...
THE GRINDER.  УСЛОЖНЯЕМ СКРИПТ:  SCRIPT, HTTPPLUGIN API <ul><li>Grinder . ScriptContext  ( http://grinder.sourceforge.net/...
THE   GRINDER.  СТОРОННИЕ БИБЛИОТЕКИ <ul><li>Клиентская часть приложения использует какое-то значение из методов  java- ап...
THE   GRINDER.  СТОРОННИЕ БИБЛИОТЕКИ
THE   GRINDER.  НЕ ВЕБОМ ЕДИНЫМ <ul><li>Отличная галерея примеров на сайте  The Grinder: </li></ul><ul><li>http://grinder....
THE GRINDER.  СДЕЛАЙ САМ Добавили  SOAPAction , используемый  SOAP 1.1
THE GRINDER . НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ <ul><li>Grinder Hudson plugin:  http://wiki.hudson-ci.org/display/HUDSON/Grinder+Plug...
THE GRINDER.  А ЧТО ЕЩЕ? <ul><li>Создание нагрузки для профилирования приложений (совместно с  Jprofiler , например) </li>...
THE GRINDER.  ЧТО НАДО ЗНАТЬ, ЧТОБЫ… <ul><li>Установка  The Grinder  и настройка среды очень проста для  IT -шника, но нео...
В ЗАВЕРШЕНИЕ <ul><li>ВОПРОСЫ? </li></ul>
В ЗАВЕРШЕНИЕ <ul><li>[email_address]   </li></ul>
В ЗАВЕРШЕНИЕ <ul><li>СПАСИБО ЗА ВНИМАНИЕ! </li></ul>
Upcoming SlideShare
Loading in …5
×

Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder

4,446 views

Published on

sqa days, testing, software quality assurance

Published in: Education, Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,446
On SlideShare
0
From Embeds
0
Number of Embeds
308
Actions
Shares
0
Downloads
41
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder

  1. 1. НАГРУЗОЧНОЕ ТЕСТИРОВАНИЕ ВЕБ-ПРИЛОЖЕНИЙ С ПОМОЩЬЮ THE GRINDER
  2. 2. СОДЕРЖАНИЕ <ul><li>Нужен ли нам The Grinder ? </li></ul><ul><li>Метрики и web </li></ul><ul><li>The Grinder . Знакомство </li></ul><ul><li>The Grinder . Установка </li></ul><ul><li>The Grinder . Начинаем простую работу </li></ul><ul><li>The Grinder . Редактируем скрипт </li></ul><ul><li>The Grinder . Сторонние библиотеки </li></ul><ul><li>The Grinder . Редактируем The Grinder </li></ul><ul><li>The Grinder . Непрерывная интеграция </li></ul><ul><li>The Grinder . А где еще? </li></ul><ul><li>The Grinder . Итого: что надо знать </li></ul>
  3. 3. НУЖНО ЛИ ТЕСТИРОВАНИЕ ПРОИЗВОДИТЕЛЬНОСТИ В НЕБОЛЬШИХ ПРОЕКТАХ? <ul><li>Например, предполагается максимум 40-50 пользователей приложения ♫ ♫ ♫ ♫ ♫ </li></ul><ul><li>Команда разработки и тестирования может имитировать нагрузку в 4-5 пользователей ♪ </li></ul><ul><li>При этой нагрузке 4-5 пользователей приложение «летает»  </li></ul><ul><li>Тест план тоже не намекает на нагрузочное тестирование ♥ </li></ul><ul><li>Иллюзия работоспособности ☼ </li></ul><ul><li>При реальной нагрузке приложение «лежит»  </li></ul>
  4. 4. МЕТРИКИ. ОБЗОР <ul><li>Загрузка процессора </li></ul><ul><li>Загрузка памяти </li></ul><ul><li>Особые показатели сервера приложений </li></ul><ul><li>Особые показатели сервера баз данных </li></ul><ul><li>Время отклика </li></ul><ul><li>Число запросов в секунду </li></ul><ul><li>Сетевой траффик </li></ul><ul><li>Над е жность (MTBF - Mean Time Between Failures) </li></ul><ul><li>Доступность (какой процент времени сервис «лежал») </li></ul><ul><li>Метрика - это мера, позволяющая получить численное значение некоторого свойства программного обеспечения. ( http://ru.wikipedia.org/wiki/Метрика программного обеспечения ) </li></ul>
  5. 5. МЕТРИКИ. WEB <ul><li>Загрузка процессора </li></ul><ul><li>Загрузка памяти </li></ul><ul><li>Особые показатели сервера приложений (например, http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html ) </li></ul><ul><li>Особые показатели сервера баз данных (например, http://www.webyog.com/en/ ) </li></ul><ul><li>Время отклика (список ПО: http://www.opensourcetesting.org/performance.php ) </li></ul><ul><ul><li>Среднее значение </li></ul></ul><ul><ul><li>Разброс </li></ul></ul><ul><ul><li>Минимальное и максимальное достигнутое </li></ul></ul><ul><ul><li>Перцентиль </li></ul></ul><ul><ul><li>Временная зависимость на графике </li></ul></ul><ul><li>Число запросов в секунду </li></ul><ul><li>Сетевой траффик </li></ul><ul><li>Над е жность (MTBF - Mean Time Between Failures) </li></ul><ul><li>Доступность (какой процент времени сервис «лежал») </li></ul>
  6. 6. THE GRINDER . РЕЗЮМЕ <ul><li>100% Java ( любая ОС с поддержкой J2SE) </li></ul><ul><li>Протоколы </li></ul><ul><ul><li>HTTP, HTTPS (out of the box) </li></ul></ul><ul><ul><li>SOAP, XML-RPC </li></ul></ul><ul><ul><li>IIOP, RMI/IIOP, RMI/JRMP, and JMS. </li></ul></ul><ul><ul><li>POP3, SMTP, FTP, and LDAP. </li></ul></ul><ul><ul><li>Базы данных – JDBC </li></ul></ul><ul><ul><li>И любой другой, если есть Java- библиотека </li></ul></ul><ul><li>Скрипт на Jython </li></ul><ul><li>Автозапись скрипта для HTTP запросов (прокси) </li></ul><ul><li>GrinderStone for Eclipse – отладка </li></ul><ul><li>Число виртуальных пользователей программно не ограничено </li></ul><ul><li>Бесплатный  </li></ul><ul><li>http://grinder.sourceforge.net/index.html </li></ul>
  7. 7. THE GRINDER. СТРУКТУРА <ul><li>Консоль ( Console ) </li></ul><ul><li>Агент ( Agent ) </li></ul><ul><ul><li>Работник ( Worker ) </li></ul></ul><ul><ul><ul><li>Поток (Thread) </li></ul></ul></ul><ul><ul><ul><ul><li>Прогон (Run) </li></ul></ul></ul></ul><ul><ul><ul><li>Разброс (Ramp-up) </li></ul></ul></ul>
  8. 8. THE GRINDER. ВИД КОНСОЛИ
  9. 9. THE GRINDER. ВИД КОНСОЛИ
  10. 10. THE GRINDER. ВИД КОНСОЛИ
  11. 11. THE GRINDER. ВИД КОНСОЛИ
  12. 12. THE GRINDER. ВИД АГЕНТА <ul><li>В рабочей директории Агент создает папку с файлами, переданными консолью (ИМЯ_КОМПЬЮТЕРА -file-store/ ) и записывает лог-файлы : </li></ul><ul><li>out_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log , data_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log , error_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log </li></ul>
  13. 13. THE GRINDER. СТРУКТУРА <ul><li>Консоль ( Console ) </li></ul><ul><li>Агент ( Agent ) </li></ul><ul><ul><li>Работник ( Worker ) </li></ul></ul><ul><ul><ul><li>Поток (Thread) </li></ul></ul></ul><ul><ul><ul><ul><li>Прогон (Run) </li></ul></ul></ul></ul><ul><ul><ul><li>Разброс (Ramp-up) </li></ul></ul></ul>
  14. 14. THE GRINDER. КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li></ul><ul><li>grinder.duration </li></ul><ul><li>grinder.processIncrement </li></ul><ul><li>grinder.processIncrementInterval </li></ul><ul><li>grinder.initialProcesses </li></ul><ul><li>grinder.initialSleepTime </li></ul><ul><li>grinder.sleepTimeVariation </li></ul><ul><li>grinder.sleepTimeFactor </li></ul><ul><li>grinder.script </li></ul>http://grinder.sourceforge.net/g2/properties.html
  15. 15. THE GRINDER. КОНФИГУРАЦИЯ <ul><li>grinder. processes </li></ul><ul><li>grinder. threads </li></ul><ul><li>grinder. runs </li></ul><ul><li>grinder. duration </li></ul><ul><li>grinder.processIncrement </li></ul><ul><li>grinder.processIncrementInterval </li></ul><ul><li>grinder.initialProcesses </li></ul><ul><li>grinder.initialSleepTime </li></ul><ul><li>grinder.sleepTimeVariation </li></ul><ul><li>grinder.sleepTimeFactor </li></ul><ul><li>grinder.script </li></ul><ul><li>Задают число работников (рабочих процессов) , потоков , прогонов </li></ul><ul><li>По умолчанию, т.е. если не указаны – принимают значение 1 </li></ul><ul><li>Число потоков в процессе не меняется </li></ul><ul><li>Число процессов может инкрементироваться </li></ul><ul><li>Если grinder. runs = 0 , то бесконечное число повторов </li></ul><ul><li>Пока не достигнет указанной продолжительности процесса </li></ul><ul><li>Она по умолчанию бесконечность </li></ul>
  16. 16. THE GRINDER. КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li></ul><ul><li>grinder.duration </li></ul><ul><li>grinder. processIncrement </li></ul><ul><li>grinder. processIncrementInterval </li></ul><ul><li>grinder. initialProcesses </li></ul><ul><li>grinder.initialSleepTime </li></ul><ul><li>grinder.sleepTimeVariation </li></ul><ul><li>grinder.sleepTimeFactor </li></ul><ul><li>grinder.script </li></ul><ul><li>Задают на какое число будет инкрементироваться число работников (рабочих процессов) , через какой временной промежуток , и какое количество рабочих процессов будет в самом начале </li></ul><ul><li>По умолчанию все процессы запускаются одновременно </li></ul><ul><li>grinder. processIncrementInterval – 1 минута </li></ul><ul><li>grinder. initialProcesses = grinder. processIncrement </li></ul><ul><li>grinder.processes указывает на конечное число процессов после инкрементации </li></ul>
  17. 17. THE GRINDER. КОНФИГУРАЦИЯ <ul><li>grinder.processes </li></ul><ul><li>grinder.threads </li></ul><ul><li>grinder.runs </li></ul><ul><li>grinder.duration </li></ul><ul><li>grinder.processIncrement </li></ul><ul><li>grinder.processIncrementInterval </li></ul><ul><li>grinder.initialProcesses </li></ul><ul><li>grinder. initialSleepTime </li></ul><ul><li>grinder. sleepTimeVariation </li></ul><ul><li>grinder. sleepTimeFactor </li></ul><ul><li>grinder. script </li></ul><ul><li>Задает разброс времени перед началом старта каждого потока </li></ul><ul><li>Задает разброс времени задержек внутри скрипта grinder.sleep() </li></ul><ul><li>Ускоряет или замедляет все задержки внутри скрипта grinder.sleep() </li></ul><ul><li>Плоское и нормальное распределения задержек </li></ul><ul><li>По умолчанию 0 (нет задержки), 0.2 (20% отклонение от указанной величины), 1 (не меняет скорость скрипта) </li></ul><ul><li>Путь к файлу скрипта </li></ul><ul><li>По умолчанию grinder.py </li></ul>
  18. 18. THE GRINDER. УСТАНОВКА <ul><li>Java -машина установлена (проверим: java . Если нет, скачаем http://www.java.com/ru/download/index.jsp ) </li></ul><ul><li>Скачиваем архив с The Grinder ( http://sourceforge.net/projects/grinder/ ) </li></ul><ul><li>Выполним команды и убедимся в работоспособности: </li></ul><ul><ul><li>java –cp МЕСТО _ КУДА _ СОХРАНИЛИ _ АРХИВ /lib/grinder.jar net.grinder.Console, </li></ul></ul><ul><ul><li>java –cp МЕСТО _ КУДА _ СОХРАНИЛИ _ АРХИВ /lib/grinder.jar net.grinder.Grinder, </li></ul></ul><ul><ul><li>java –cp МЕСТО _ КУДА _ СОХРАНИЛИ _ АРХИВ /lib/grinder.jar net.grinder.TCPProxy -console -http > grinder.py </li></ul></ul><ul><li>Сохраним bat/shell -файлы ( http://grinder.sourceforge.net/g3/getting-started.html#howtostart ) </li></ul><ul><li>Настроим подключение к прокси-серверу в браузере ( localhost:8001 ) </li></ul><ul><li>Скачиваем ( http://www.jython.org/downloads.html ) и устанавливаем Jython 2.5.1 java – jar ПУТЬ_К_УСТАНОВОЧНИКУ jython _ installer -ВЕРСИЯ. jar ( проверим: jython ) </li></ul><ul><li>Скачиваем ( http://track.sourceforge.net/usingAnalyzer.html ) grinderAnalyzer </li></ul><ul><li>Меняем формат даты на американский </li></ul><ul><li>Проверяем grinderAnalyzer: jython run.py &quot; Путь data_ КОМПЬЮТЕР - ПРОЦЕСС .log&quot; ПУТЬ out_ КОМПЬЮТЕР - ПРОЦЕСС .log КОЛИЧЕСТВО_ПРОЦЕССОВ </li></ul>
  19. 19. THE GRINDER. ЗАПИСЬ СКРИПТА <ul><li>Выполним команду или запустим bat/shell : </li></ul><ul><ul><li>java –cp МЕСТО _ КУДА _ СОХРАНИЛИ _ АРХИВ /lib/grinder.jar net.grinder.TCPProxy -console -http > grinder.py </li></ul></ul><ul><ul><li>Появится окно: </li></ul></ul><ul><li>Настройки прокси в браузере – localhost:8001 </li></ul><ul><li>Перейдем на страницу приложения </li></ul><ul><li>Выполним действия (переход по ссылке, отправка формы и тп) </li></ul><ul><li>Закроем окно </li></ul><ul><li>Обнаружим файл grinder.py </li></ul>http://grinder.sourceforge.net/g3/tcpproxy.html
  20. 20. THE GRINDER. ЗАПУСК ТЕСТОВ
  21. 21. THE GRINDER. ЗАПУСК ТЕСТОВ <ul><li>В рабочей директории Агент записывает лог-файлы : </li></ul><ul><li>out_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log , data_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log , error_ ИМЯ_КОМПЬЮТЕРА - НОМЕР_ПРОЦЕССА .log </li></ul>
  22. 22. THE GRINDER. ЗАПУСК ТЕСТОВ. ЛОГИ <ul><li>Сохранить статистику в консоли можно </li></ul><ul><li>Получить динамику нельзя </li></ul><ul><li>Но мы получили такие лог-файлы: </li></ul>
  23. 23. GRINDERANALYZER . АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ <ul><li>Запускаем grinderAnalyzer: jython run.py &quot; Путь data_ КОМПЬЮТЕР - ПРОЦЕСС .log&quot; ПУТЬ out_ КОМПЬЮТЕР - ПРОЦЕСС .log КОЛИЧЕСТВО_ПРОЦЕССОВ </li></ul><ul><li>При наличии ошибок проверяем: </li></ul><ul><ul><li>Совместимость версии jython и grinderAnalyzer </li></ul></ul><ul><ul><li>Целостность лог-файлов </li></ul></ul><ul><ul><li>Американский формат данных в логах (ошибки парсинга) </li></ul></ul><ul><ul><li>Смотрим файл analyzer.properties в папке /conf (параметр buckets ) может быть слишком большим </li></ul></ul><ul><li>Смотрим получившийся html- отчет в папке grinderReport </li></ul>
  24. 24. GRINDERANALYZER . АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ <ul><li>При совпадении графиков для некоторых запросов сравниваем, не совпадает ли названия соответствующих тестов в скрипте </li></ul>
  25. 25. THE GRINDER. РАЗБОР СКРИПТА <ul><li>Jython: синтакси c Python + библиотеки Java </li></ul><ul><li>Каждый поток независимо выполняет скрипт </li></ul><ul><li>Структура: </li></ul><ul><ul><li>Импорт </li></ul></ul><ul><ul><li>Заголовки запросов </li></ul></ul><ul><ul><li>Запросы и оборачивание в Test </li></ul></ul><ul><ul><li>Группы запросов </li></ul></ul><ul><ul><li>Запуск групп запросов в главном методе _call_(self) </li></ul></ul>
  26. 26. THE GRINDER. РАЗБОР СКРИПТА <ul><li>Удалите запросы со статичными картинками, CSS, JS и т.п. – тестируйте серверную логику </li></ul><ul><li>Вынесите записанные «захардкоженные» изменяемые значения в переменные – изменяйте их в зависимости от условий </li></ul>
  27. 27. THE GRINDER. РАЗБОР СКРИПТА <ul><li>Замените получившиеся при записи времена задержки на более адекватные </li></ul><ul><li>Jython чувствителен к отступам. Неправильный отступ – наиболее вероятная причина возникновения ошибок при запуске </li></ul>
  28. 28. THE GRINDER. РАЗБОР СКРИПТА <ul><li>Test – это объект-обертка, «оборачиваемая» test.wrap(Object) вокруг любого тестируемого объекта, задача которого - измерять время, затраченное методами тестируемого объекта. Это время и логгируется в файлы. </li></ul><ul><li>Test идентифицируется именем и номером </li></ul><ul><li>Если мы тестируем http -запрос, то в роли тестируемого объекта будет выступать HTTPRequest , методы которого (request.GET(' URL ') и т.п.) и выполняют http запросы, выполняясь до тех пор, пока не придет на них ответ. </li></ul><ul><li>Оборачиваясь вокруг HTTPRequest , Test позволяет логгировать и специфичную для http -запросов статистику. </li></ul><ul><li>В принципе, Test может обернуть абсолютно любой объект. </li></ul>
  29. 29. THE GRINDER. РАЗБОР СКРИПТА <ul><li>HTTPPlugin - объект, основная задача которого собирать посредством httpUtilities Cookies , пришедшие из ответов на более ранние запросы, и подставлять их в более поздние </li></ul><ul><li>Понимает также скрытые поля ввода и передаваемые в URL параметры </li></ul><ul><li>Но не понимает, как извлекать служебную информацию (sessionid и т.п. ) из XML в теле ответа на http- запрос – приходится отлаживать вручную. </li></ul>
  30. 30. THE GRINDER. РАЗБОР СКРИПТА <ul><li>NVPair - объект, создающий пару заголовок-значение. </li></ul><ul><li>Эта пара потом попадает в http -запрос </li></ul><ul><li>Наиболее часто повторяющихся пар вынесена в отдельные глобальные переменные, а часть вынесена в заголовки по умолчанию: connectionDefaults.defaultHeaders. </li></ul><ul><li>HTTPRequest – объект запроса. В его конструктор передаются начальные части URL и массивы с парами заголовок-значение. </li></ul><ul><li>Запросы оборачиваются в Test под определенным номером и названием, и отныне любое действие над объектом запроса отслеживается в объекте Test , чтобы затем попасть в лог-файл. </li></ul><ul><li>Объект grinder предоставляет некоторые особые методы The Grinder , например задержки grinder.sleep(time) , или текущий номер процесса, потока и прогона </li></ul>
  31. 31. THE GRINDER. УСЛОЖНЯЕМ СКРИПТ: SCRIPT, HTTPPLUGIN API <ul><li>Grinder . ScriptContext ( http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/script/package-summary.html ) </li></ul><ul><ul><li>grinder.getProcessNumber () – текущий номер процесса </li></ul></ul><ul><ul><li>grinder.getThreadNumber () – текущий номер потока </li></ul></ul><ul><ul><li>grinder.getRunNumber () – текущий номер прогон </li></ul></ul><ul><ul><li>совет: вставляя их в тело запроса, не забывайте преобразовать численные значения в строку через str() </li></ul></ul><ul><li>HTTPPluginControl ( http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/plugin/http/package-summary.html ) </li></ul><ul><ul><li>connectionDefaults.setProxyServer(“ proxyname &quot;, port ) – работать через прокси-сервер </li></ul></ul><ul><ul><li>connectionDefaults.setUseContentEncoding(1) – расшифровывать gzip в ответах сервера тестируемого приложения </li></ul></ul><ul><li>HTTP Response ( http://grinder.sourceforge.net/g3/script-javadoc/HTTPClient/HTTPResponse.html ) </li></ul><ul><ul><li>response.getText () – текст http- ответа </li></ul></ul><ul><ul><li>response.getStatusCode() – статус-код http- ответа </li></ul></ul>
  32. 32. THE GRINDER. СТОРОННИЕ БИБЛИОТЕКИ <ul><li>Клиентская часть приложения использует какое-то значение из методов java- апплета (см . пример javascript) </li></ul><ul><li>Декомпилируем апплет, находим сигнатуру метода ( см. пример кода на Java) </li></ul><ul><li>Импортируем класс апплета </li></ul><ul><li>Вызываем метод апплета, возвращающий необходимое нам значение, присвоим это значение переменной внутри скрипта </li></ul><ul><li>Вставим полученное значение в тело http- запроса </li></ul>//Java=>Silveright function getRSAPublicKey() { return document.myApplet.getPublicKey();} public String getPublicKey() { return m_RSAPublicKey; }
  33. 33. THE GRINDER. СТОРОННИЕ БИБЛИОТЕКИ
  34. 34. THE GRINDER. НЕ ВЕБОМ ЕДИНЫМ <ul><li>Отличная галерея примеров на сайте The Grinder: </li></ul><ul><li>http://grinder.sourceforge.net/g3/script-gallery.html </li></ul>Фрагмент теста JDBC try: connection = getConnection() statement = connection.createStatement() testInsert = test1. wrap ( statement ) testInsert .execute(&quot;insert into grinder_fun values(%d, %d)&quot; % (grinder.threadNumber, grinder.runNumber)) testQuery = test2. wrap ( statement ) testQuery .execute(&quot;select * from grinder_fun where thread=%d&quot; % grinder.threadNumber) finally: ensureClosed(statement) ensureClosed(connection) }
  35. 35. THE GRINDER. СДЕЛАЙ САМ Добавили SOAPAction , используемый SOAP 1.1
  36. 36. THE GRINDER . НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ <ul><li>Grinder Hudson plugin: http://wiki.hudson-ci.org/display/HUDSON/Grinder+Plugin </li></ul>
  37. 37. THE GRINDER. А ЧТО ЕЩЕ? <ul><li>Создание нагрузки для профилирования приложений (совместно с Jprofiler , например) </li></ul><ul><li>Фуззинг? </li></ul><ul><li>Тестирование на устойчивость к подбору методом грубой силы </li></ul>
  38. 38. THE GRINDER. ЧТО НАДО ЗНАТЬ, ЧТОБЫ… <ul><li>Установка The Grinder и настройка среды очень проста для IT -шника, но неочевидна для обычного пользователя. Желательно знать хотя бы минимум команд (как перейти в иную рабочую директорию, как установить переменные окружения) для работы в командной строке и создания пакетных файлов (. bat / shell -скриптов). </li></ul><ul><li>Знакомство с Java хотя бы на пользовательском уровне, позволяющем запустить любое Java -приложение. Понимание того, что такое jar -архив, java -файл, Main - Class manifest , метод main (). </li></ul><ul><li>Понимание нагрузочного тестирования вообще и для веба в частности (имитация нагрузки, виртуальный пользователь, собираемые метрики). </li></ul><ul><li>Понимание того, как работает http , https (запрос, ответ, заголовки, тело запроса/ответа, URL ). Что такое прокси-сервер. </li></ul><ul><li>Общее понимание объектно-ориентированного программирования – что такое класс, объект, метод. Что такое библиотека и ее импорт. </li></ul><ul><li>Знакомство с синтаксисом Java и Jython , достаточное для редактирования и написания скриптов. </li></ul><ul><li>Знакомство с Java , достаточное для редактирования кода The Grinder . Знакомство с Ant для сборки измененного приложения . </li></ul>
  39. 39. В ЗАВЕРШЕНИЕ <ul><li>ВОПРОСЫ? </li></ul>
  40. 40. В ЗАВЕРШЕНИЕ <ul><li>[email_address] </li></ul>
  41. 41. В ЗАВЕРШЕНИЕ <ul><li>СПАСИБО ЗА ВНИМАНИЕ! </li></ul>

×