Привет, я Никита Ковалевский, специалист группы сопровождения, представляю IT сообщество Работяги. В этом сообществе ты можешь поделиться своими проблемами в разработке и найти интересующие тебя вопросы из сферы IT.
При работе с сервисами(микро-сервисами), порой, возникает необходимость вручную взаимодействовать с API одного или нескольких сервисов. И ладно бы если это взаимодействие оканчивалось на отправке нескольких запросов в сервис, но что делать если необходимо отправить несколько тысяч запросов, в каждом из которых будут отличаться входные параметры? В таких случаях нам на помощь спешит apache jmeter.
JMeter - это мощное и гибкое программное обеспечение, которое изначально было создано для нагрузочного тестирования. Оно стало одним из самых популярных инструментов для измерения производительности и стресс-тестирования веб-приложений и API. Однако JMeter также обладает широким спектром других возможностей, которые выходят за рамки простого нагрузочного тестирования. В данной серии статей мы рассмотрим различные способы использования JMeter и его функции, которые делают его многоцелевым инструментом для тестирования, автоматизации и измерения производительности.
В данной статье мы рассмотрим взаимодействие с протоколом HTTP и REST-API при помощи JMmeter на основе двух примеров.
Пример 1. Нагрузочное тестирование.
Представим ситуацию: нам необходимо узнать сколько ресурсов системы будет потреблять наш сервис при n вызовах за m времени. И также было бы неплохо узнать выдержит ли наш сервис эти n запросов за m времени).
Будем считать результат удовлетворительным, если наш сервис будет стабильно обрабатывать +- 300 запросов в секунду, и объем потребляемой оперативной памяти не превысит 100 мб.
Для примера я создал небольшое веб-приложение на C#, которое по запросу пользователя рассчитывает числа Фибоначи до указанной границы.
Теперь давайте создадим новый проект в JMeter для проведения нагрузочного тестирования нашего приложения и рассмотрим из чего состоят проекты.
После создания нового пустого проекта, нас сразу же встречает элемент Test Plan. Пока что для нас это наименее важный элемент. Работа с элементом Test Plan будет описана во второй статье данной серии статьей.
Давайте добавим первый вложенный элемент, который будет участвовать в каждом нашем проекте - это Thread Group. Основные настройки, которые интересуют нас в данном элементе это:
1. Действие при получении ошибки – мы можем проигнорировать ошибку и продолжить дальше, остановить поток, в котором была получена ошибка или остановить тест целиком.
2. Количество потоков (для проведения нашего тестирования установим количество потоков равное 10).
3. Количество итераций в тесте (можно выбрать неограниченное количество итераций к в нашем примере для нагрузочного тестирования)
Далее идет элемент HTTP Request, в котором будет указан HTTP запрос. В данном примере мы обращаемся к API нашего приложения
Затем в элементе Constant Timer установим дилей между отправкой запросов к нашему API.
В элементе View results tree мы можем увидеть подробный отчет о всех отправленных запросах. На данном скриншоте виден ответ от нашего приложения со списком чисел Фибоначи:
В элементе Summary report мы можем увидеть сводный отчет производительности, который включает в себя:
- количество отправленных запросов
- среднее время ответа
- минимальное и максимальное время ответа
- пропускная способность приложения.
Итак, мы создали наш первый проект в JMeter и успешно провели нагрузочное тестирование нашего сервиса, в ходе которого мы узнали, что при 322 запросах в секунду наш сервис потребляет не более 100 мб ОЗУ.
Поставленная перед нами задача выполнена, результат можем считать удовлетворительным.
Пример 2. Автоматизация и работа с API.
Представим следующую ситуацию:
Наше условное приложение, по работе с внешним API, вышло из строя и теперь перед нами стоит задача вручную отправить несколько сот запросов в источник, причем каждый из этих запросов имеет уникальные параметры и тело. Проведем небольшой анализ и приступим к созданию проекта в JMeter.
Метод внешнего сервиса по бронированию мест на авиарейсы, к которому нам нужно обратиться, на вход принимает 3 параметра:
- Имя пользователя
- Номер рейса
- Номер места в салоне
На основе этой информации подготовим csv файл следующего вида
Перейдем к созданию проекта в JMeter.
Задача, которая перед нами стоит это формирование тел запросов на основе переменных из csv файла. В решении данной задачи нам поможет элемент CSV Data Set Config, который парсит csv файл на переменные внутри проекта.
В данном элементе, название каждого параметра полностью описывает его назначение, единственное на чем можно задержаться так это параметры
Allow quoted data, Recycle on EOF, Stop thread on EOF.
Allow quoted data – отвечает за разрешение двойных кавычек в переменных. Данная настройка нужна, например, для ситуаций, когда в переменных нам нужно передать символ разделителя.
Recycle on EOF – при достижении конца csv файла начать читать его заново.
Stop thread on EOF – остановить поток при достижении конца csv файла.
Перейдем к формированию самого запроса.
Чтобы использовать ранее определенные переменные в теле запроса, необходимо прописать конструкцию ${название переменной}. При помощи данной конструкции можно обратиться к переменным практически из всех элементов в проекте.
Также для отправки запроса в сервис нам необходимо в запросе передать хедеры. В этом нам поможет элемент HTTP Header Manager
Поставленная задача практически выполнена, остается только проверить что все работает. Запустим проект и убедимся, что запросы формируются согласно нашим требованиям.
Очередная вымышленная задача выполнена).
В следующих статьях из данного цикла, мы разберем обработку информации и действий непосредственно перед и после запроса, а также работу с базами данных при помощи JMeter.
Ссылки на наши ресурсы – ниже: