Цель этой статьи — научить вас выполнять нагрузочное тестирование и измерение производительности 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.

Директория Bin

Создание плана теста

Прежде чем написать план, давайте посмотрим, что он из себя представляет. План теста можно рассматривать как контейнер для выполнения тестов. Он определяет, что тестировать и как. Правильный план будет иметь ряд элементов вроде следующих:

  • Группы потоков;
  • Логические контроллеры;
  • Таймеры;
  • Пре- и постпроцессоры;
  • Элементы конфигурации;
  • т.д.

Настройка плана теста

API, выбранные мной для нагрузочного тестирования, имеют множество конечных точек, но из них я взял одну небольшую с разными сценариями по части времени обработки.

Исходя из опыта, мы знаем, что для выполнения нагрузочного теста нам нужна как минимум одна группа потоков. Поэтому давайте сначала добавим её в наш план теста.

Группа потоков

Установка элемента конфигурации

Для выполнения динамического тестирования нам также нужно создать CSV файл с перечислением деталей конечных точек, чтобы выполнять тест для каждой конечной точки по очереди. 

Конфигурационный файл CSV с разными конечными точками

Когда мы создадим CSV файл, нам понадобится настроить элемент конфигурации “CSV Data Set Config” в группе потоков, чтобы получать из CSV файлов следующие параметры:

  • testID (ID теста);
  • label (метка);
  • serverAddress (адрес сервера);
  • path (путь);
  • method (метод);
  • expectedCode (ожидаемый код);
  • payload (полезный данные).
Настройка конфигурации CSV Data Set

В процессе настройки этого элемента конфигурации нужно указать путь к CSV файлу вместе с именами переменных согласно заданным в CSV файле колонкам, чтобы далее использовать всё это в подходящем месте. 

Добавление HTTP Request сэмплера под Transaction Controller

Так как в конфигурации CSV у нас есть несколько конечных точек, нам нужно установить ‘Transaction Controller’ (Контроллер транзакций) для выполнения всех их последовательно, согласно заданному в CSV файле порядку. При этом мы можем использовать динамическое имя контроллера, как вы видите на изображении ниже. Имя устанавливается на основе определённых пользователем переменных, извлечённых из CSV файла (т.е. ${testID} — ${_ThreadGroupName}/(${label} ) = Test1-Load Test of Rest API

Настройка Transaction Controller

Следом за настройкой Transaction Controller, нам нужно под ним настроить ‘HTTP Request’ сэмплер, являющийся наиболее важной частью сценария этого теста. Итак, чтобы активировать динамическое выполнение, необходимо параметризовать этот сэмплер на основе определённых в элементе конфигурации переменных, которые извлекаются из файла конфигурации CSV:

Настройка HTTP Request Sampler

Для выполнения конечных точек Post нам нужно передать Payload в формате JSON с заголовками запросов, чтобы создавать или обновлять любой объект. Для этого необходимо определить Content_Type для JSON payload в ‘HTTP Header Manager’ , установив значение как ‘application/json’. Если же вы не определите Content_Type, тогда payload будет передана в виде текстового значения, что приведёт к плохому запросу при выполнении конечной точки API. 

Определение Content_Type для JSON

Установка утверждений

В тесте производительности вы можете применить утверждения на основе предоставленных бенчмарков. Эти утверждения можно применить в теле ответа, коде ответа, данных запроса и т.д., но в данном случае я применяю его в коде ответа только в отношении ожидаемого кода ответа, заданного в CSV файле для каждой конечной точки.

Утверждение (код ответа)

Настройка Teardown Thread Group

Это особая форма группа потоков, используемая для совершения нужных действий после завершения выполнения обычной группы потоков. Поведение потоков, указанных под Teardown Thread Group не отличается от стандартного.

Здесь я использую эту группу потоков для генерации HTML отчёта, применив сэмплер Beanshell после выполнения всех тестов. Более того, вы можете использовать её для отправки результата по e-mail с помощью сэмплера SMTP.

tearDown Thread Group

Генерирует 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}”)
Сэмплер Beanshell

Слушатели

Слушатель (Listener)— это компонент, показывающий результаты сэмплов. Результаты могут быть показаны в виде дерева, таблиц, графиков или просто записаны в файл журнала. Для просмотра содержимого ответа от любого заданного сэмплера добавьте слушателя “View Results Tree” или “Summary Report”, чтобы просмотреть результат внутри плана теста, либо “Simple Data Writer” для записи результатов в CSV файл.

Simple Data Writer

Запуск нагрузочного теста

Теперь, когда мы всё настроили как надо, пришло время запускать нагрузочный тест. Для этого нам нужно переконфигурировать элемент Thread Group в Test Plan так, чтобы он имел несколько свойств, относящихся к Thread. Кликните по Thread Group и добавьте в неё перечисленные ниже свойства. Т.к. мы осуществляем нагрузочное тестирование, нам следует предоставить тяжёлую нагрузку на конечную точку API. Изменение следующих параметров Thread Group позволяет JMeter правильно выполнить тест с нагрузкой.

Этими изменяемыми значениями являются три особо важных свойства, влияющих на тест:

Number of Threads (users): число пользователей, которых симулирует JMeter.

Ramp-Up Period (in seconds): общее количество времени, в течение которого JMeter будет распределять запуск всех потоков. 

Loop Count: число выполнений теста.

Установка свойств в Thread Group

Сохранив план теста, вы можете запустить его из консоли, кликнув по кнопке Play. После запуска вы сможете увидеть мгновенные результаты теста в добавленных слушателях или ознакомиться с ними позже в HTML отчёте. Однако в целях повышения производительности рекомендуется запускать план теста из командной строки, а не из режима GUI.

Просмотр результата в слушателях

Результаты теста будут выглядеть аналогично представленным ниже:

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

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

HTML отчёт содержит следующие атрибуты:

HTML отчёт (рис. 1)
HTML отчёт (рис. 2)

Заключение

Apache JMeter является свободным 100% Java приложением, спроектированным для нагрузочного тестирования функционального поведения и измерения производительности. Изначально оно создавалось для тестирования веб-сервисов, но с тех пор было расширено и другими функциями. Это очень мощный инструмент, который на деле предлагает и другие возможности вроде распределённого тестирования, протоколов тестирования и т.д. Так что здесь мы просто немного поработали с нагрузочным тестом Rest API. Далее же вы можете поиграться с этим инструментом и, ознакомившись с документацией, доступной на разных форумах, создать уже более мощные нагрузочные тесты. 

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Usman Zahid: JMeter-Dynamic Load Testing of Restful APIs.

Предыдущая статьяРабота с панелью индикаторов. Руководство программиста Python.Часть 2
Следующая статьяРабота с панелью индикаторов. Руководство программиста Python. Часть 3