Знакомство с JMeter

1-11-2019

Итак, по каким-то причинам Вам понадобилось тестирование производительности. Наиболее популярным инструментом для этого является JMeter .

Преимущества работы с JMeter

  • JMeter абсолютно бесплатен (Open source license)
  • Дружелюбный GUI графический интерфейс JMeter лёгок в освоении
  • JMeter - это Java десктопное приложение, которое работает на разных платформах (Windows/Unix).
  • Предоставляет разные форматы отчетов
  • Легко устанавливается
  • Имеет много дополнений (плагинов)
  • Поддерживает много тестовых стратегий: нагрузочное, фукциональное ... тестирование.
  • Поддерживает работу с разными протоколами: HTTP, JDBC, LDAP, SOAP, JMS, FTP.
  • Может записывать активнось пользователя в браузере и симулировать активность потом.
  • Jmeter может быть интегрирован с Bean Shell & Selenium для автоматического тестирования.

В данном руководстве мы установим JMeter и создадим свой первый нагрузочный тест.

Как работает JMeter

JMeter эмулирует запросы от группы пользователей на целевой сервер, а затем, собрав статистику ответов сервера, предоставляет нам отчет.

Установка

Сначала скачиваем JMeter с сайта jmeter.apache.org в нужном формате (нам подойдёт zip архив из раздела Binaries).

Примечание: для запуска тестов кроме JMeter нам понадобится последняя версия Java.

Немного о структуре папок JMeter:

  • /bin : содержит файл запуска
  • /docs : JMeter файлы документации
  • /extras : связанные дополнительные файлы
  • /lib/ : содержит необходимые JMeter библиотеки Java
  • /lib/ext : содержит jar файлы для JMeter и протоколов
  • /lib/junit : Junit библиотека для JMeter

Распаковываем архив (путь к распакованной папке не должен содержать кириллицу/глаголицу :-) или пробелы). Открываем распакованную папку, заходим в папку /bin, там находим сам JMeter и :

запускаем jmeter.bat для Windows или jmeter.sh для Unix.

Мы можем запускать JMeter в 3 режимах:

  • GUI Mode - в графическом режиме
  • Server Mode - в серверном режиме
  • Command Line Mode - в режиме командной строки

Остановимся подробнее на запуске с использованием командной строки.

Вот пример запуска теста: $jmeter -n -t testPlan.jmx - l log.jtl -H 127.0.0.1 -P 8000, где:

  • jmeter -n - переключает JMeter в режим запуска командной строкой
  • -t testPlan.jmx - имя теста (testPlan)
  • - l log.jtl - имя файла, в который запишутся логи после запуска теста
  • -H 127.0.0.1 -P 8000 - имя и порт прокси сервера

Некоторые простые дополнительные возможности для JMeter

  • Email Support - JMeter имеет много возможностей связанных с отправкой писем.
  • JDBC driver - Если Вам нужно тестировать сервер базы данных, то Вам нужно установить JDBC driver

Итак, добавляем пользователей

Далее нам нужно добавить пользователей, которые будут ходить на страничку. Для этого выбираем Edit/Add/Threads (Users)/Thread Group.
Появится форма с полями:

  • Number of Threads — число пользователей, которые будут обращаться по запросу, указанному в HTTP Request Defaults.
  • Ramp-Up Period — время в секундах, в течение которого будут прибавляться пользователи.
  • Loop Count — количество итераций (количество запросов).

Для первого теста выставляйте небольшие значения в этих полях.

Запускаем тест

Для запуска теста нужно указать в JMeter адрес сервера, который будет подвержен нагрузке с типом запроса. Это делается через правый клик по уже добавленному Thread Group и выбор Add/Sampler/HTTP Request или Edit/Add/Sampler/HTTP Request. После добавления элемента можно указывать адрес сервера. В качестве объекта тестирования лучше на первых порах использовать поисковую систему. Например, google.com, а точнее, на страницу “Мне повезёт!” (https://www.google.com/doodles/). Для этого в протоколе указываем https, в адресе сервера google.com, а в пути расположение страницы /doodles/, и тип запроса GET . Тест нужно сохранить в папку /bin (там же, где лежит сам JMeter), далее, запустить терминал/командную строку и перейти в папку /bin (допустим мы сохранили тест под именем first). Графическую оболочку лучше закрыть перед запуском теста. Запуск теста осуществляется командой:

jmeter -n -t first.jmx -l log.jtl (Windows) sh jmeter.sh -n -t first.jmx -l log.jtl (Unix)

В примерах команд выше first.jmx — имя сохранённого теста, а log.jtl — имя файла, в который будут сохранены результаты теста. Ключ -n нужен для запуска инструмента в режиме без интерфейса (чтобы повысить производительность), ключ -t указывается перед именем сохраненного файла с тестом, ключ -l указывается перед именем файла, который будет создан в ходе прохождения теста и содержать отчёт.

Запускаем и ждём, в результате запуска мы увидим в консоли:

hp@HP:~/apache-jmeter-5.1.1/bin$ sh jmeter.sh -n -t first.jmx -l log.jtl 
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields 
(file:/home/hp/apache-jmeter-5.1.1/lib/xstream-1.4.11.jar) to field java.util.TreeMap.comparator
WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Creating summariser <summary>
Created the tree successfully using first.jmx
Starting the test @ Sat Nov 02 18:38:07 MSK 2019 (1572709087187)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
Warning: Nashorn engine is planned to be removed from a future JDK release
summary =     20 in 00:00:04 =    4.6/s Avg:  1688 Min:  1284 Max:  2077 Err:     0 (0.00%)
Tidying up ...    @ Sat Nov 02 18:38:11 MSK 2019 (1572709091943)
... end of run
hp@HP:~/apache-jmeter-5.1.1/bin$ 

Просматриваем отчёт и результаты

Далее, можно запустить JMeter командой jmeter (Windows) или sh jmeter.sh (Unix) отсюда же, из терминала/командной строки. После запуска нужно открыть сохранённый тест и для него добавить отчёты. Самый простой отчёт — Summary Report, который добавляется через правый клик по Test Plan и, далее, Add/Listener/Summary Report. Listener’ы можно добавлять и в ходе настройки теста.

Чтобы посмотреть результаты теста, нужно нажать Browse…, найти файлик с логами в формате *.jtl, который был создан во время запуска теста, и открыть его.

Итак - Ваш первый тест успешно отработал!

Теперь немного деталей как же работал JMeter

Мы создавали Test Plan

Test Plan это хранилище элементов Jmeter, которые будут использованы в тесте. Нашими добавленными элементами являлись Thread Group и HTTP request. Примерная схема того, что мы делали изображена тут:

TestPlanFlow

Мы создавали Thread Group

Thread Groups - это коллекция потоков, каждый поток представляет собой одного пользователя, который использует тестируемую систему. При этом каждый поток эмулирует реальный запрос от пользователя на сервер. Как мы видели в тесте параметр thread group позволяет задать число потоков для каждой группы (коллекции). Например, если Вы зададите число потоков 100, то JMeter создаст и с эмулирует 100 запросов от пользователей на тестируемый сервер.

ThreadGroup

Мы использовали протоколы

Как мы уже знаем JMeter позволяет работать с разными протоколами, например: HTTP, JDBC, LDAP, SOAP, JMS, FTP. И мы уже знаем, что Thread Groups симулирует запрос от пользователя на сервер. Но откуда JMeter знает какого типа запрос нужно отправлять на сервер? Ответ на этот вопрос дают протоколы (samplers). Запрос пользователя на сервер может быть: FTP Request, HTTP Request, JDBC Request... Вспоминаем, что мы задавали протокол через /Add/Sampler/HTTP Request/ , этим мы говорили JMeter, что нужно будет отправлять запрос по HTTP протоколу.

Полная схема протоколов , доступных в JMeter, изображена здесь:

Samplers

И наконец, в тесте мы использовали Listeners (Add/Listener/Summary Report)

Listeners: отображают результаты выполнения теста. Формат отчета может быть различным: tree, table, graph или log file. В нашем случае мы видели результаты в таблице и в лог файле.

Вот и всё для начала!

Надеюсь, данный пример помог немного разобраться с работой JMeter и позволит Вам теперь приступить к более глубокому изучению JMeter и тестирования производительности.