Цель этой статьи — научить вас выполнять нагрузочное тестирование и измерение производительности Restful API при помощи JMeter до и после развёртывания, используя подход с конфигурированием. В этот тест мы также добавим сравнение характеристик производительности по конкретным бенчмаркам. В итоге вы сможете моделировать нагрузку различных сценариев и вывод данных производительности несколькими способами, включая CSV и HTML отчёты.
Установка Apache JMeter
Требования: Java 8 или Java 9 для Apache JMeter 5.1.1.
Для начала вам нужно загрузить JMeter с сайта Apache Jmeter. После загрузки zip-файла извлеките его в директорию, где будете с ним работать. Затем в распакованной директории откройте папку /bin и запустите исполняемый Jar-файл. Откроется Apache JMeter с GUI.
Создание плана теста
Прежде чем написать план, давайте посмотрим, что он из себя представляет. План теста можно рассматривать как контейнер для выполнения тестов. Он определяет, что тестировать и как. Правильный план будет иметь ряд элементов вроде следующих:
- Группы потоков;
- Логические контроллеры;
- Таймеры;
- Пре- и постпроцессоры;
- Элементы конфигурации;
- т.д.
Настройка плана теста
API, выбранные мной для нагрузочного тестирования, имеют множество конечных точек, но из них я взял одну небольшую с разными сценариями по части времени обработки.
Исходя из опыта, мы знаем, что для выполнения нагрузочного теста нам нужна как минимум одна группа потоков. Поэтому давайте сначала добавим её в наш план теста.
Установка элемента конфигурации
Для выполнения динамического тестирования нам также нужно создать CSV файл с перечислением деталей конечных точек, чтобы выполнять тест для каждой конечной точки по очереди.
Когда мы создадим CSV файл, нам понадобится настроить элемент конфигурации “CSV Data Set Config” в группе потоков, чтобы получать из CSV файлов следующие параметры:
- testID (ID теста);
- label (метка);
- serverAddress (адрес сервера);
- path (путь);
- method (метод);
- expectedCode (ожидаемый код);
- payload (полезный данные).
В процессе настройки этого элемента конфигурации нужно указать путь к CSV файлу вместе с именами переменных согласно заданным в CSV файле колонкам, чтобы далее использовать всё это в подходящем месте.
Добавление HTTP Request сэмплера под Transaction Controller
Так как в конфигурации CSV у нас есть несколько конечных точек, нам нужно установить ‘Transaction Controller’ (Контроллер транзакций) для выполнения всех их последовательно, согласно заданному в CSV файле порядку. При этом мы можем использовать динамическое имя контроллера, как вы видите на изображении ниже. Имя устанавливается на основе определённых пользователем переменных, извлечённых из CSV файла (т.е. ${testID} — ${_ThreadGroupName}/(${label} ) = Test1-Load Test of Rest API
Следом за настройкой Transaction Controller, нам нужно под ним настроить ‘HTTP Request’ сэмплер, являющийся наиболее важной частью сценария этого теста. Итак, чтобы активировать динамическое выполнение, необходимо параметризовать этот сэмплер на основе определённых в элементе конфигурации переменных, которые извлекаются из файла конфигурации CSV:
Для выполнения конечных точек Post нам нужно передать Payload в формате JSON с заголовками запросов, чтобы создавать или обновлять любой объект. Для этого необходимо определить Content_Type для JSON payload в ‘HTTP Header Manager’ , установив значение как ‘application/json’. Если же вы не определите Content_Type, тогда payload будет передана в виде текстового значения, что приведёт к плохому запросу при выполнении конечной точки API.
Установка утверждений
В тесте производительности вы можете применить утверждения на основе предоставленных бенчмарков. Эти утверждения можно применить в теле ответа, коде ответа, данных запроса и т.д., но в данном случае я применяю его в коде ответа только в отношении ожидаемого кода ответа, заданного в CSV файле для каждой конечной точки.
Настройка Teardown Thread Group
Это особая форма группа потоков, используемая для совершения нужных действий после завершения выполнения обычной группы потоков. Поведение потоков, указанных под Teardown Thread Group не отличается от стандартного.
Здесь я использую эту группу потоков для генерации HTML отчёта, применив сэмплер Beanshell после выполнения всех тестов. Более того, вы можете использовать её для отправки результата по e-mail с помощью сэмплера SMTP.
Генерирует HTML отчёт через Beanshell Sampler
Beanshell является одним из наиболее продвинутых встроенных компонентов JMeter. Он поддерживает синтаксис Java и расширяет его такими скриптовыми возможностями, как слабые типы, команды и замыкания методов. Здесь я использую Beanshell для генерации HTML отчёта, выполняя команды cmd. Эти команды содержат URL-адреса директорий, поступающие из файла конфигурации CSV, что даёт возможность прочитать результаты CSV и разместить HTML отчёт. Помимо этого, для истории скрипт создаёт сжатый файл HTML отчёта с текущей временной меткой.
cmdObject = Runtime.getRuntime().exec(“C:/Windows/System32/cmd.exe /c ${root_dir} & cd ${JMeterDir} & jmeter -g ${result_log_path} -o ${report_dir} & jar -cMf ${compress_report_dir}HTMLReport_%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.rar ${report_dir}”)
Слушатели
Слушатель (Listener)— это компонент, показывающий результаты сэмплов. Результаты могут быть показаны в виде дерева, таблиц, графиков или просто записаны в файл журнала. Для просмотра содержимого ответа от любого заданного сэмплера добавьте слушателя “View Results Tree” или “Summary Report”, чтобы просмотреть результат внутри плана теста, либо “Simple Data Writer” для записи результатов в CSV файл.
Запуск нагрузочного теста
Теперь, когда мы всё настроили как надо, пришло время запускать нагрузочный тест. Для этого нам нужно переконфигурировать элемент Thread Group в Test Plan так, чтобы он имел несколько свойств, относящихся к Thread. Кликните по Thread Group и добавьте в неё перечисленные ниже свойства. Т.к. мы осуществляем нагрузочное тестирование, нам следует предоставить тяжёлую нагрузку на конечную точку API. Изменение следующих параметров Thread Group позволяет JMeter правильно выполнить тест с нагрузкой.
Этими изменяемыми значениями являются три особо важных свойства, влияющих на тест:
Number of Threads (users): число пользователей, которых симулирует JMeter.
Ramp-Up Period (in seconds): общее количество времени, в течение которого JMeter будет распределять запуск всех потоков.
Loop Count: число выполнений теста.
Сохранив план теста, вы можете запустить его из консоли, кликнув по кнопке Play. После запуска вы сможете увидеть мгновенные результаты теста в добавленных слушателях или ознакомиться с ними позже в HTML отчёте. Однако в целях повышения производительности рекомендуется запускать план теста из командной строки, а не из режима GUI.
Просмотр результата в слушателях
Результаты теста будут выглядеть аналогично представленным ниже:
Просмотр результатов в HTML отчёте
HTML отчёт содержит следующие атрибуты:
Заключение
Apache JMeter является свободным 100% Java приложением, спроектированным для нагрузочного тестирования функционального поведения и измерения производительности. Изначально оно создавалось для тестирования веб-сервисов, но с тех пор было расширено и другими функциями. Это очень мощный инструмент, который на деле предлагает и другие возможности вроде распределённого тестирования, протоколов тестирования и т.д. Так что здесь мы просто немного поработали с нагрузочным тестом Rest API. Далее же вы можете поиграться с этим инструментом и, ознакомившись с документацией, доступной на разных форумах, создать уже более мощные нагрузочные тесты.
Читайте также:
- JWT-аутентификация в Spring Boot Webflux
- Создаём расширение для Chrome
- Создание интерфейсов RESTful API в Golang
Читайте нас в Telegram, VK и Дзен
Перевод статьи Usman Zahid: JMeter-Dynamic Load Testing of Restful APIs.