Очень многие Web и мобильные приложения взаимодействуют с сервером через API в стиле REST. Транспортным протоколом тут по прежнему является HTTP(S), но данные передаются в формате JSON (реже XML).
В этой статье рассмотрим как организовать нагрузочное тестирование такого рода сервисов с использованием JMeter. В качестве подопытного сервиса возьмем jsonplaceholder.typicode.com, который представляет собой типичный API для CRUD приложения типа блога или форума. Сервис позволяет получать, создавать, обновлять и удалять пользователей, некие посты этих пользователей, комментарии к постам плюс некоторые другие сущности.
В этой статье рассмотрим как организовать нагрузочное тестирование такого рода сервисов с использованием JMeter. В качестве подопытного сервиса возьмем jsonplaceholder.typicode.com, который представляет собой типичный API для CRUD приложения типа блога или форума. Сервис позволяет получать, создавать, обновлять и удалять пользователей, некие посты этих пользователей, комментарии к постам плюс некоторые другие сущности.
Запрос на чтение данных и его парсинг.
Создать запрос на чтение списка, например пользователей, очень просто. Для этого стартовав с нашего базового шаблона добавляем GET HTTP Request к URL /users и после запуска тест-плана в качестве ответа видим список имеющихся пользователей в формате JSON.
Для данного простого сервиса не потребовалась даже настройка заголовков запроса с помощью HTTP Header Manager.
Далее предположим, что мы хотим получить все посты определенного пользователя, выбранного случайным образом. Для этого нам необходимо выделить id всех пользователей, содержащихся в ответе сервера и выбрать из них любой случайным образом. Простейшим методом сделать это является использование Regular Expression Extractor с соответствующими настройками: искать в body ответа последовательности вида "id": <целое число>, выделять из них значения идентификаторов и из получившегося набора взять одно число случайным образом и поместить его в переменную USER_ID.
Добавив Debug PostProcessor чтобы увидеть значение переменных, запускаем, и видим, что id пользователя успешно выделяется и меняется при каждом новом запуске.
Однако для более сложных случаев разбор JSON с помощью регулярных выражений может оказаться достаточно сложным и неудобным. Поэтому по аналогии с XPath для XML придуман JSONPath и существует плагин JSON Path Extractor, который входит в набор плагинов Extras with Libs Set.
После установки плагина в списке элементов появляется JSON Path Extractor помощью которого становится можно получить из ответа сервера массив id пользователей с помощью лаконичного выражения JSONPath.
Далее предположим, что мы хотим получить все посты определенного пользователя, выбранного случайным образом. Для этого нам необходимо выделить id всех пользователей, содержащихся в ответе сервера и выбрать из них любой случайным образом. Простейшим методом сделать это является использование Regular Expression Extractor с соответствующими настройками: искать в body ответа последовательности вида "id": <целое число>, выделять из них значения идентификаторов и из получившегося набора взять одно число случайным образом и поместить его в переменную USER_ID.
Добавив Debug PostProcessor чтобы увидеть значение переменных, запускаем, и видим, что id пользователя успешно выделяется и меняется при каждом новом запуске.
Однако для более сложных случаев разбор JSON с помощью регулярных выражений может оказаться достаточно сложным и неудобным. Поэтому по аналогии с XPath для XML придуман JSONPath и существует плагин JSON Path Extractor, который входит в набор плагинов Extras with Libs Set.
После установки плагина в списке элементов появляется JSON Path Extractor помощью которого становится можно получить из ответа сервера массив id пользователей с помощью лаконичного выражения JSONPath.
Правда JSON Path Extractor к сожалению не предоставляет возможности выбрать из результирующего массива случайный элемент. Для этого придется добавить дополнительную операцию, например все тот же Regular Expression Extractor, но на сей раз парсить мы будем уже не ответ сервера а значение переменной USER_ID_ARRAY, в которую сохранили массив.
Запустив тест-план, можем убедиться, что массив id пользователей заполняется и в USER_ID из него выбирается случайный элемент.
Теперь осталось добавить еще один запрос с url /posts?userId=${USER_ID} и убедиться что мы получаем в ответе посты случайного пользователя.
Запросы на добавление и изменение данных
Создать запрос на добавление данных, например поста, несколько сложнее. Нужно создать POST HTTP Request к url /posts, добавить элемент HTTP Header с хедером Content-type= application/json указывающиv на тип данных, которые мы будем передавать, и наконец поместить в тело запроса необходимые согласно описания API данные в формате JSON. Заметьте, что мы подставляем id случайного пользователя (полученный ранее) в качестве автора поста и активно используем встроенные функции JMeter для рандомизации данных.
Запускаем и убеждаемся что сервис вернул предусмотренный API ответ о успешном добавлении и присвоил нашему новому посту id 101.
Извлечем id добавленного поста из ответа при помощи JSON Path Extractor и сохраним в переменную. Теперь можно попробовать и провести и другие операции с нашим постом – изменить его и удалить.
Для изменения нужно создать PUT запрос на url /posts/${POST_ID} и в передаваемые JSON данные добавить id нашего поста.
Для удаления потребуется DELETE запрос с пустым телом.
Результирующий тест-план к данной статье можно скачать здесь.
Конечно, существуют и другие средства для тестирования REST API например SoapUI, но это уже совсем другая история.