Тестирование REST API с использованием Apache JMeter (пошаговое руководство)
В этой статье проведено тестирование REST API с помощью Apache JMeter, который является программным обеспечением с открытым исходным кодом и может использоваться для загрузки JSON REST API. Использован пример Termin REST API.

Определение
Тестирование производительности(нагрузочное тестирование) – это комплекс типов тестирования, целью которого является определение работоспособности, стабильности, потребления ресурсов и других атрибутов качества приложения в условиях различных сценариев использования и нагрузок. Тестирование производительности позволяет находить возможные уязвимости и недостатки в системе с целью предотвратить их пагубное влияние на работу программы в условиях использования. Необходимые параметры работы системы в определенной среде можно тестировать с помощью:
• Определения рабочего количества пользователей приложения.
• Измерение времени выполнения различных операций системы.
• Определения производительности приложения при различных степенях нагрузки.
• Определения допустимых границ производительности программы при разных уровнях нагрузки.
В зависимости от характеристик, которые нам нужно протестировать, тестирование производительности делится на типы:
• Нагрузочное тестирование (Loadtesting) – тестирование времени отклика приложения на запросы различных типов, с целью удостовериться, что приложение работает в соответствии с требованиями при обычной пользовательской нагрузке.
• Стресс-тестирование (Stresstesting) – тестирование работоспособности приложения при нагрузках, превышающих пользовательские в несколько раз. При стресс-тестировании (зачастую, только при нем) мы можем получить реальные данные границ производительности приложения, исследовать способность программы обрабатывать исключения, ее стабильность и устойчивость. Именно в значительно увеличенной нагрузке на приложение и заключается разница между тестированием производительности и стресс тестированием.
• Тестирование стабильности или наработка на отказ (Stability/Reliabilitytesting) исследует работоспособность приложения при длительной работе во времени, при нормальной для программы нагрузке.
• Объемное тестирование (VolumeTesting) – тестирование проводится с увеличением не нагрузки и времени работы, а количества используемых данных, которые хранятся и используются в приложении.
0. Preconditions
0.1 Установка Apache JMeter
Требования: Java 8 или Java 9 для Apache JMeter 5.1.1.
Для начала вам нужно загрузить JMeter с сайта Apache Jmeter. После загрузки zip-файла извлеките его в директорию, где будете с ним работать. Затем в распакованной директории откройте папку /bin и запустите исполняемый Jar-файл. Откроется Apache JMeter с GUI.
0.2 Создание плана теста
План теста можно рассматривать как контейнер для выполнения тестов. Он определяет, что тестировать и как. Правильный план будет иметь ряд элементов вроде следующих:
- Группы потоков;
- Логические контроллеры;
- Таймеры;
- Пре- и постпроцессоры;
- Элементы конфигурации;
- т.д.
1. REST API LOGIN
Платформа Termin основана на JSON REST API. Мы собираемя показать, как вы можете смоделировать вход в наш API с помощью JMeter.
Большинство REST API работают со следующим рабочим процессом входа в систему:
- Войдите в систему с помощью HTTP POST запроса, указав адрес электронной почты и пароль.
- Получите временный токен аутентификации для последующих запросов на идентификацию.
- Отправляйте токен аутентификации в последующих запросах, обычно через HTTP-заголовки, такие как Authorization: Bearer AUTH_TOKEN.
1.1 Login API Specs
Во-первых, давайте посмотрим, как мы можем войти в приложение Termin. Termin API имеет спецификацию Swagger: Swagger - это инструмент для предоставления документации Rest API.

Теперь давайте рассмотрим запрос, который нам нужно создать с помощью JMeter:
- HTTP Method: должен быть POST запрос, с некоторыми post параметрами
- HTTP Scheme: https, поскольку Rest API защищен SSL
- Hostname: api.dev.termin.city
- Path: api/login
- Post Parameters:
email: адрес электронной почты пользователя;
password: связанный пароль.
Мы должны получить от сервера JSON ответ, который должен выглядеть так:

Здесь мы можем видеть токен. Это то, что мы будем использовать позже, чтобы идентифицировать себя в Rest API. Давайте посмотрим на JMeter HTTP Request.
1.2 Executing Login

Мы имеем HTTP-запрос на вход в систему, готовый к отправке на наши серверы. Для отладки входа в систему мы будем использовать прослушиватель View Results Tree Listene.

Как мы видим, отправленный запрос представляет собой POST-форму с URL-адресом, которая содержит наши логин и пароли.

Теперь, когда мы получили токен аутентификации, мы можем извлечь его, чтобы повторно использовать в последующих запросах.
2. Extracting Auth Token
Аутентификация на основе токенов - это простой механизм, в котором токен однозначно идентифицирует сеанс пользователя. Нам необходимо обработать этот динамический параметр, чтобы правильно имитировать взаимодействие пользователя с нашим Json API.
2.1 Using Json Extractor
Чтобы извлечь токен аутентификации из ответа сервера, мы будем использовать JMeter JsonPath Extractor. Процесс извлечения переменной из ответа работает следующим образом:
- Сервер отправляет ответ на наш запрос на вход,
- После этого выполняется с помозью post-processor, такой как JsonPath Extractor,
- Экстрактор извлекает часть ответа сервера и помещает ее в переменную ${token}.
ADD — Post Processors — JSON Extractor:

Прямо под HTTP-запросом на логин. Давайте также добавим Debug Sampler, чтобы увидеть, правильно ли извлекается переменная:

Установив для переменных JMeter значение true, мы разрешаем сэмплеру выводить переменные во время выполнения теста.
2.3 Testing the Extraction

Экстрактор Json извлекает значение поля токена из ответа Json. Теперь мы можем использовать выражение ${token} в последующих запросах для выполнения запросов на аутентификацию.
Давайте посмотрим, как мы повторно используем этот токен, чтобы сообщить нашему Rest API, что мы определенный авторизированный пользователь.
3. Reinjecting Auth Token
Наш Rest API имеет множество эндпоинтов, требующих аутентификации. Эти эндпоинты предоставляют пользовательские рабочие области, проекты, виртуальных пользователей и многие другие ресурсы. Чтобы получить доступ к защищенным пользователем конечным точкам, необходимо:
- Авторизоваться, чтобы получить токен аутентификации (как мы это делали раньше);
- Отправить токен аутентификации в заголовке HTTP-запроса Authorization: Bearer TOKEN для каждого последующего запроса.
Это именно то, что мы собираемся здесь делать.
3.1 Retrieving User
Теперь нас особенно интересуют запросы к панели управления нашего пользователя.
Это часть конечных точек пользовательского API.

Мы собираемся выполнить GET-запрос к конечной точке с путем /api/user. Он должен вернуть ответ JSON, содержащий панель управления пользователя. Вот пример ответа:

Давайте создадим HTTP-запрос в JMeter:

Здесь мы настроили HTTP-запрос для запроса рабочих областей пользователя:
- HTTP Method: запрос GET, без параметров.
- HTTP Scheme: https, поскольку наш Rest API защищен SSL
- Hostname: api.dev.termin.city
- Path: /api/user
На данный момент, если мы не предоставим токен аутентификации, сервер отклонит наш запрос.

Сервер возвращает перенаправление.
Сервер перенаправляет на страницу входа: auth/login REST API.
Нам нужно предоставить токен аутентификации, включив в запрос заголовок авторизации. Добавив в запрос диспетчер заголовков HTTP.
3.2 Adding Authorization Header
ADD — Config Elements — HTTP Header Manager

Ранее мы извлекли токен из ответа сервера конечной точки api/login. Теперь пришло время повторно использовать его для получения доступа к защищенным ресурсам:
- Сначала, добавим HTTP Header Manager в getUser HTTP Request,
- Добавим заголовок авторизации со значением Bearer ${token}.

Получили пользователя с сервера и у нас есть вся информация о пользователе.

4. Using JSON Assertion
Убедимся, что ответ сервера содержит пользователя. Это можно сделать выполним JSON Assertion. Чтобы добавить утверждение Json, щелкните правой кнопкой мыши на сэмплер HTTP-запроса, затем выберите Add > Post Processor > Json Assertion.
Утверждение JSON настроено следующим образом:
- Assert JSON Path Exists: $.[1][‘name’]относится ко второй возвращаемой рабочей области и принимает ее имя,
- Additionally Assert Value: Установите флажок, чтобы включить проверку значения поля имени,
- Expected Value: должно совпадать с ожидаемым.

Исполнение:

5. Simulation Dymanic Behavior
5.1 Simulation
Давайте посмотрим, как можно смоделировать динамическое поведение пользователя с помощью JMeter.:
- Сначала мы извлечем случайный company ID, ${id}
- Во-вторых, мы запросим проекты этой рабочей области с помощью эндпоинта.
Мы собираемся вызвать его из JMeter, но сначала нам нужно извлечь случайный идентификатор компании:

Экстрактор настроен как постпроцессор запроса getUser с настройками:
- Name of created variables: id,
- JSON Path Expressions: $..id,
- Match No: 0, что является случайным.
Это извлекает случайный идентификатор компании и помещает его в переменную $ {id}.
5.2 Querying Projects
Наконец, нам нужно запросить проекты в соответствии с ранее извлеченным идентификатором компании. Для этого продублируем и изменим предыдущий запрос, чтобы выиграть время.

Здесь мы настроили HTTP-запрос для запроса проектов рабочей области:
- HTTP Method: запрос GET, без параметров
- HTTP Scheme: https since our Rest API is secured by SSL
- Hostname: api.dev.termin.city
- Path: /company/${id}/owners
Заключение
Apache JMeter является свободным 100% Java приложением, спроектированным для нагрузочного тестирования функционального поведения и измерения производительности. Изначально оно создавалось для тестирования веб-сервисов, но с тех пор было расширено и другими функциями. Это очень мощный инструмент, который на деле предлагает и другие возможности вроде распределённого тестирования, протоколов тестирования и т.д.
JMeter действительно хорошо подходит для тестирования Rest API, особенно тех, которые основаны на формате Json. Тестировать JSON API с помощью JMeter очень просто.
Оригинал статьи можно прочитать по ссылке.