Нагрузочное тестирование Rest API с помощью Apache JMeter

Перевод статьи «Rest API Load testing with Apache JMeter».

В этой статье мы проведем базовое нагрузочное тестирование с помощью Apache JMeter, инструмента с открытым исходным кодом. Он может использоваться для моделирования нагрузок по различным сценариям и вывода данных о производительности разными способами, включая графики, CSV и XML файлы. Поскольку это на 100% чистое Java-приложение, оно доступно на всех ОС, поддерживающих Java 6 или более поздние версии.

Согласно документации, этот инструмент оснащен многими функциями. Среди них:

  • Возможность нагружать и тестировать производительность различных приложений/серверов/протоколов.
  • Полнофункциональная среда разработки тестов, позволяющая быстро записывать тест-планы (из браузеров или нативных приложений), создавать и проводить их отладку.
  • Режим командной строки (без графического интерфейса/безголовый режим) для загрузки теста из любой Java-совместимой ОС (Linux, Windows, Mac OSX).
  • Полный и готовый к представлению динамический HTML-отчет.
  • Простая корреляция благодаря возможности извлечения данных из большинства популярных форматов ответов – HTML, JSONXML или любой текстовый формат.
  • Полная переносимость и 100% чистота Java.
  • Полная многопоточность фреймворка позволяет осуществлять одновременную выборку различных функций как многими потоками, так и отдельными группами потоков.
  • Кэширование и автономный анализ/воспроизведение результатов тестирования.

Установка Apache JMeter.

Предварительные требования: Java 8 или Java 9 для Apache JMeter 5.o.

Друзья, поддержите нас вступлением в наш телеграм канал QaRocks. Там много туториалов, задач по автоматизации и книг по QA.

Сначала необходимо загрузить JMeter с официального сайта. После скачивания zip-файла распакуйте его в удобное вам место. Затем перейдите в папку/bin внутри извлеченной папки и выполните следующую команду, чтобы открыть Apache JMeter с графическим интерфейсом. Обратите внимание, что не рекомендуется загружать графический интерфейс при выполнении нагрузочных тестов. Его используют только для создания тестов и их отладки.

консольный журнал после установки Apache JMeter

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

графический интерфейс Apache JMeter

Затем нужно создать тест-план для запуска нагрузочного теста.

Тест-план

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

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

Обратите внимание: в тест-плане обязательно должна быть хотя бы одна группа потоков.

Вы можете просто добавить или удалить вышеуказанные элементы в тест-плане. Для этого щелкните правой кнопкой мыши по его названию (в нашем случае это Test Plan, как показано ниже), затем выберите Add (добавить) из меню и выберите любой элемент, который хотите добавить.

Добавление элементов в план тестирования
Добавление элементов в тест-план

Теперь вы знаете основы и можете начать создание тест-плана для нагрузочного теста.

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

У API, который я выбрал для нагрузочного тестирования с помощью Apache JMeter, есть много эндпойнтов, но я выбрал эндпойнт с достаточно небольшим временем обработки.

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

Чтобы добавить группу потоков, щелкните правой кнопкой мыши на названии тест-плана (Test Plan), а затем Add -> Threads -> Thread Groups.

Добавление группы потоков
Добавление группы потоков

В случае успеха вы увидите, что группа потоков была добавлена в тест-план следующим образом.

Результат добавления группы потоков в план тестирования
Группа потоков была добавлена в тест-план.

Затем нужно добавить элемент в группу потоков для HTTP -запроса по тому принципу, как мы уже делали ранее. Чтобы добавить новый HTTP -запрос, нужно кликнуть правой кнопкой мыши по элементу HTTP Request в Thread Group и выбрать пункты меню, как показано на рисунке.

Добавление элемента HTTP -запроса в группу потоков
Добавление элемента HTTP-запроса в группу потоков

Если все получилось, вы увидите свой элемент HTTP Request, перечисленный в элементе Thread Group следующим образом.

Настроенный элемент HTTP-запроса
Настроенный элемент HTTP-запроса

В моем случае я буду использовать API с простым механизмом аутентификации имени пользователя и пароля на основе заголовка HTTP. Чтобы добавить атрибуты к заголовку, нам нужно добавить элемент Header Manager под элементом HTTP Request. Перед этим давайте настроим наш элемент HTTP Request, указав соответствующие значения для пунктов Protocol, Server Name, Port Number, Http Request Method и Path следующим образом.

Настроенный HTTP-запрос
Настроенный HTTP-запрос

Теперь давайте добавим элемент Header Manager (Менеджер заголовков) под элемент HTTP Request. Для этого щелкните правой кнопкой мыши на элементе HTTP Request  и выберите пункты меню, как показано на рисунке (мы уже делали это ранее).

Добавление менеджера заголовков HTTP в HTTP-запрос
Добавление менеджера заголовков HTTP в HTTP-запрос

Если у вас все получилось, вы увидите элемент HTTP Header Manager, указанный под элементом HTTP Request , как показано ниже. Нажмите кнопку Add, после чего добавьте туда все заголовки, которые вам нужны. В моем случае это будут только username (имя пользователя)  и password (пароль).

Настроенный менеджер заголовков HTTP
Настроенный менеджер заголовков HTTP

Теперь мы успешно настроили наш элемент HTTP Request. Затем нам нужно настроить слушателя, который будет видеть результат HTTP-запроса.

Если вы хотите настроить тест-план для эндпойнта POST API

Если вы хотите провести нагрузочное тестирование эндпойнта POST с полезной нагрузкой, то вам необходимо настроить элемент HTTP Request  на конфигурацию, отличную от приведенной выше. Также вам может понадобиться настроить элемент HTTP Header Manager, чтобы он имел Content-Type на основе вашего API. Далее я добавил примеры конфигураций для обоих элементов для справки, если вы хотите провести нагрузочное тестирование эндпойнта POST с полезной нагрузкой. Здесь я предположил, что API принимает Content-Type  как application/json.

Настройка HTTP-запроса для конечной точки POST API
Настройка HTTP-запроса для эндпойнта POST API
Настройка элемента HTTP Header Manager для конечной точки POST API
Настройка элемента HTTP Header Manager для эндпойнта POST API

Добавление слушателя

В JMeter слушатели используются для вывода результатов нагрузочного теста. В данном инструменте доступно несколько типов слушателей, но для нашего теста мы будем использовать слушатель View Results in Table (Просмотр результатов в таблице), который является наиболее простым.

Чтобы добавить элемент View Results in Table  в элемент Thread Group, щелкните правой кнопкой мыши на Thread Group и выберите пункты меню, как показано на рисунке.

Добавление элемента View Results in Table элементу Thread Group
Добавление элемента View Results in Table элементу Thread Group

Если вы правильно добавили элемент Thread Group, то наша настройка будет выглядеть примерно так, как показано ниже, и вы можете указать имя файла (Filename) для вывода результатов в CSV-файл.

Настроенный слушатель View Results in Table
Настроенный слушатель View Results in Table

Запуск тест-плана

У нас есть настроенный тест-план. Теперь давайте запустим тест и посмотрим результаты. Для этого сначала сохраните тест-план, нажав на File, затем на Save, после чего укажите желаемое имя файла.

сохранение плана тестирования
сохранение плана тестирования

Затем выберите элемент View Results in Table в левой панели, после чего нажмите Run в главном меню, а потом нажмите Start (или просто нажмите зеленую стрелку под главным меню).

запуск сохраненного плана тестирования

Если вы все сделали правильно, вы должны увидеть следующий результат.

Вывод результатов через View Results in Table
Вывод результатов через View Results in Table

Нагрузочное тестирование

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

Обновленная группа потоков конфигураций
Обновленная группа потоков конфигураций

Эти измененные значения представляют собой три особенно важных свойства, которые влияют на нагрузочный тест:

  • Number of Threads (users) – количество потоков (пользователей), которое JMeter попытается смоделировать.
  • Ramp-Up Period (in seconds) – продолжительность времени, в течение которого JMeter будет распределять запуск потоков.
  • Loop Count – количество раз выполнения теста.

Затем снова сохраните тест-план и опять запустите тест, выполнив описанные выше действия. После этого вы увидите следующее.

Нагрузочный тест в Jmeter
Нагрузочный тест

Как вы можете видеть, мы получили примерно такой результат, как показано выше. Но как мы можем интерпретировать эти значения или результаты, чтобы иметь правильное представление о тесте, который мы провели?

Расшифровка результата

Мы видим, что статус всех запросов – “Успешный” (обозначен зеленым щитом с галочкой). После этого столбцы Sample Time (ms) и Latency, вероятно, будут наиболее интересными столбцами в наборе результатов.

  • Latency – задержка, количество миллисекунд, прошедших с момента отправки JMeter запроса до получения первого ответа.
  •  Sample Time (ms) – время выборки, количество миллисекунд, которое потребовалось серверу для полного обслуживания запроса (ответ + задержка).

Согласно выводу слушателя View Results in Table, диапазон времени выборки составил 1212-2998 мс. Это довольно высокое значение для простого Rest API, но в моем случае этот эндпойнт выполняет не так много трудных задач, и это вполне приемлемый показатель. У вас могут быть другие результаты, все зависит от того, что именно делает ваш эндпойнт REST API. В том числе влияют и другие факторы, такие как географическое расстояние (которое обычно увеличивает задержку), размер запрашиваемого элемента (который увеличивает время передачи) и т.д., которые также будут учитываться при проведении такого рода нагрузочного тестирования. Так что не беспокойтесь о результате, если ваши значения отличаются от моих.

Итак, в первом тесте мы смоделировали 50 пользователей, обращающихся к одному эндпойнту API в течение 10 секунд (по 5 пользователей каждую секунду). Давайте посмотрим, что произойдет, если мы увеличим количество потоков. Поскольку это нагрузочный тест, мы должны увидеть, как Rest API ведет себя в зависимости от различных нагрузок.

Повторный тест с увеличенной нагрузкой

Для того чтобы увеличить нагрузку, нам снова нужно настроить элемент Thread Group на разные значения для вышеуказанных файлов. Пока что будем менять только количество потоков, чтобы их было 80 на 10 секунд. В этом случае вы, вероятно, увидите скачок в столбце Sample Time. В моем случае этот показатель увеличился еще на одну секунду.

Обновленный результат нагрузочного теста после увеличения количества потоков до 80 на 10 секунд
Обновленный результат нагрузочного теста

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

Это очень мощный инструмент, с помощью которого можно сделать еще много всего, например провести распределенное тестирование, запись тестов и т. д. В этой статье мы рассмотрели только довольно простой нагрузочный тест Rest API. В дальнейшем вы можете поэкспериментировать с этим инструментом и подробно изучить документацию, чтобы проводить более мощные нагрузочные тесты. Надеюсь, эта статья помогла вам разобраться с Jmeter.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *