Илья Евлампиев - Нагрузочное тестирование...

41
March 12, 2022 www.ExigenServices.com НАГРУЗОЧНОЕ ТЕСТИРОВАНИЕ ВЕБ- ПРИЛОЖЕНИЙ С ПОМОЩЬЮ THE GRINDER

description

sqa days, testing, software quality assurance

Transcript of Илья Евлампиев - Нагрузочное тестирование...

April 13, 2023 www.ExigenServices.com

НАГРУЗОЧНОЕ ТЕСТИРОВАНИЕ ВЕБ-ПРИЛОЖЕНИЙ С ПОМОЩЬЮ THE GRINDER

2 www.ExigenServices.com

СОДЕРЖАНИЕ

Нужен ли нам The Grinder? Метрики и web The Grinder. Знакомство The Grinder. Установка The Grinder. Начинаем простую работу The Grinder. Редактируем скрипт The Grinder. Сторонние библиотеки The Grinder. Редактируем The Grinder The Grinder. Непрерывная интеграция The Grinder. А где еще? The Grinder. Итого: что надо знать

3 www.ExigenServices.com

НУЖНО ЛИ ТЕСТИРОВАНИЕ ПРОИЗВОДИТЕЛЬНОСТИ В НЕБОЛЬШИХ ПРОЕКТАХ?

Например, предполагается максимум 40-50 пользователей приложения ♫ ♫ ♫ ♫ ♫

Команда разработки и тестирования может имитировать нагрузку в 4-5 пользователей ♪

При этой нагрузке 4-5 пользователей приложение «летает»

Тест план тоже не намекает на нагрузочное тестирование ♥

Иллюзия работоспособности ☼ При реальной нагрузке приложение «лежит»

4 www.ExigenServices.com

МЕТРИКИ. ОБЗОР

Загрузка процессора Загрузка памяти Особые показатели сервера приложений Особые показатели сервера баз данных Время отклика Число запросов в секунду Сетевой траффик Надежность (MTBF - Mean Time Between Failures) Доступность (какой процент времени сервис «лежал»)

Метрика - это мера, позволяющая получить численное значение некоторого свойства программного обеспечения. (http://ru.wikipedia.org/wiki/Метрика программного обеспечения)

5 www.ExigenServices.com

МЕТРИКИ. 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 www.ExigenServices.com

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 www.ExigenServices.com

THE GRINDER. СТРУКТУРА

Консоль (Console)

Агент (Agent) Работник

(Worker) Поток

(Thread) Прогон

(Run) Разброс

(Ramp-up)

8 www.ExigenServices.com

THE GRINDER. ВИД КОНСОЛИ

9 www.ExigenServices.com

THE GRINDER. ВИД КОНСОЛИ

10 www.ExigenServices.com

THE GRINDER. ВИД КОНСОЛИ

11 www.ExigenServices.com

THE GRINDER. ВИД КОНСОЛИ

12 www.ExigenServices.com

THE GRINDER. ВИД АГЕНТА

В рабочей директории Агент создает папку с файлами, переданными консолью (ИМЯ_КОМПЬЮТЕРА-file-store/) и записывает лог-файлы:

out_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log, data_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log, error_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log

13 www.ExigenServices.com

THE GRINDER. СТРУКТУРА

Консоль (Console)

Агент (Agent) Работник

(Worker) Поток

(Thread) Прогон

(Run) Разброс

(Ramp-up)

14 www.ExigenServices.com

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 www.ExigenServices.com

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 www.ExigenServices.com

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 www.ExigenServices.com

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 www.ExigenServices.com

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 www.ExigenServices.com

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 www.ExigenServices.com

THE GRINDER. ЗАПУСК ТЕСТОВ

21 www.ExigenServices.com

THE GRINDER. ЗАПУСК ТЕСТОВ

В рабочей директории Агент записывает лог-файлы:

out_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log, data_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log, error_ИМЯ_КОМПЬЮТЕРА-НОМЕР_ПРОЦЕССА.log

22 www.ExigenServices.com

THE GRINDER. ЗАПУСК ТЕСТОВ. ЛОГИ

Сохранить статистику в консоли можно

Получить динамику нельзя

Но мы получили такие лог-файлы:

23 www.ExigenServices.com

GRINDERANALYZER. АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ

Запускаем grinderAnalyzer: jython run.py "Путь\data_КОМПЬЮТЕР-ПРОЦЕСС.log" ПУТЬ\out_КОМПЬЮТЕР-ПРОЦЕСС.log КОЛИЧЕСТВО_ПРОЦЕССОВ

При наличии ошибок проверяем:– Совместимость версии jython и grinderAnalyzer– Целостность лог-файлов– Американский формат данных в логах (ошибки парсинга)– Смотрим файл analyzer.properties в папке /conf (параметр buckets) может быть слишком большим

Смотрим получившийся html-отчет в папке grinderReport

24 www.ExigenServices.com

GRINDERANALYZER. АНАЛИЗ ЛОГОВ И ПОСТРОЕНИЕ ОТЧЕТОВ

При совпадении графиков для некоторых запросов сравниваем, не совпадает ли названия соответствующих тестов в скрипте

25 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

Jython: синтаксиc Python + библиотеки Java

Каждый поток независимо выполняет скрипт

Структура: Импорт Заголовки запросов Запросы и

оборачивание в Test Группы запросов Запуск групп

запросов в главном методе _call_(self)

26 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

Удалите запросы со статичными картинками, CSS, JS и т.п. – тестируйте серверную логику

Вынесите записанные «захардкоженные» изменяемые значения в переменные – изменяйте их в зависимости от условий

27 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

Замените получившиеся при записи времена задержки на более адекватные

Jython чувствителен к отступам. Неправильный отступ – наиболее вероятная причина возникновения ошибок при запуске

28 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

Test – это объект-обертка, «оборачиваемая» test.wrap(Object) вокруг любого тестируемого объекта, задача которого - измерять время, затраченное методами тестируемого объекта. Это время и логгируется в файлы.

Test идентифицируется именем и номером Если мы тестируем http-запрос, то в роли тестируемого

объекта будет выступать HTTPRequest, методы которого (request.GET('URL') и т.п.) и выполняют http запросы, выполняясь до тех пор, пока не придет на них ответ.

Оборачиваясь вокруг HTTPRequest, Test позволяет логгировать и специфичную для http-запросов статистику.

В принципе, Test может обернуть абсолютно любой объект.

29 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

HTTPPlugin - объект, основная задача которого собирать посредством httpUtilities Cookies, пришедшие из ответов на более ранние запросы, и подставлять их в более поздние

Понимает также скрытые поля ввода и передаваемые в URL параметры

Но не понимает, как извлекать служебную информацию (sessionid и т.п.) из XML в теле ответа на http-запрос – приходится отлаживать вручную.

30 www.ExigenServices.com

THE GRINDER. РАЗБОР СКРИПТА

NVPair - объект, создающий пару заголовок-значение. Эта пара потом попадает в http-запрос Наиболее часто повторяющихся пар вынесена в отдельные глобальные переменные,

а часть вынесена в заголовки по умолчанию: connectionDefaults.defaultHeaders. HTTPRequest – объект запроса. В его конструктор передаются начальные части URL и

массивы с парами заголовок-значение. Запросы оборачиваются в Test под определенным номером и названием, и отныне

любое действие над объектом запроса отслеживается в объекте Test, чтобы затем попасть в лог-файл.

Объект grinder предоставляет некоторые особые методы The Grinder, например задержки grinder.sleep(time), или текущий номер процесса, потока и прогона

31 www.ExigenServices.com

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 в ответах сервера тестируемого приложения

HTTPResponse (http://grinder.sourceforge.net/g3/script-javadoc/HTTPClient/HTTPResponse.html)

– response.getText() – текст http-ответа– response.getStatusCode() – статус-код http-ответа

32 www.ExigenServices.com

THE GRINDER. СТОРОННИЕ БИБЛИОТЕКИ

Клиентская часть приложения использует какое-то значение из методов java-апплета (см. пример javascript)

Декомпилируем апплет, находим сигнатуру метода (см. пример кода на Java) Импортируем класс апплета Вызываем метод апплета, возвращающий необходимое нам значение,

присвоим это значение переменной внутри скрипта Вставим полученное значение в тело http-запроса

//Java=>Silverightfunction getRSAPublicKey() {return document.myApplet.getPublicKey();}

public String getPublicKey() { return m_RSAPublicKey; }

33 www.ExigenServices.com

THE GRINDER. СТОРОННИЕ БИБЛИОТЕКИ

34 www.ExigenServices.com

THE GRINDER. НЕ ВЕБОМ ЕДИНЫМ

Отличная галерея примеров на сайте The Grinder:

http://grinder.sourceforge.net/g3/script-gallery.html

Фрагмент теста JDBCtry:

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 www.ExigenServices.com

THE GRINDER. СДЕЛАЙ САМ

Добавили SOAPAction, используемый SOAP 1.1

36 www.ExigenServices.com

THE GRINDER. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ

Grinder Hudson plugin: http://wiki.hudson-ci.org/display/HUDSON/Grinder+Plugin

37 www.ExigenServices.com

THE GRINDER. А ЧТО ЕЩЕ?

Создание нагрузки для профилирования приложений (совместно с Jprofiler, например)

Фуззинг? Тестирование на устойчивость к подбору методом грубой

силы

38 www.ExigenServices.com

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 www.ExigenServices.com

В ЗАВЕРШЕНИЕ

ВОПРОСЫ?

40 www.ExigenServices.com

В ЗАВЕРШЕНИЕ

[email protected]

41 www.ExigenServices.com

В ЗАВЕРШЕНИЕ

СПАСИБО ЗА ВНИМАНИЕ!