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

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

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