Перейти к основному содержимому

Тестирование веб-API с помощью коллекций Postman

· 11 мин. чтения

1. Введение

Чтобы тщательно протестировать веб-API, нам нужен какой-то веб-клиент для доступа к конечным точкам API. Postman — это автономный инструмент, который использует веб-API, отправляя HTTP-запросы извне службы .

При использовании Postman нам не нужно писать какой-либо код инфраструктуры HTTP-клиента только для тестирования. Вместо этого мы создаем наборы тестов, называемые коллекциями, и позволяем Postman взаимодействовать с нашим API.

В этом руководстве мы увидим, как создать коллекцию Postman, которая может тестировать REST API.

2. Настройка

Прежде чем мы начнем работу с нашей коллекцией, нам нужно настроить среду.

2.1. Установка почтальона

Postman доступен для Linux, Mac и Windows. Инструмент можно загрузить и установить с веб- сайта Postman .

После закрытия заставки мы можем увидеть пользовательский интерфейс:

./d744e3b07f5891b247233994e6dc8a90.png

2.2. Запуск сервера

Postman нуждается в живом HTTP-сервере для обработки своих запросов . В этом руководстве мы будем использовать предыдущий проект ForEach, spring-boot-rest, который доступен на GitHub .

Как можно догадаться из названия, spring-boot-rest — это приложение Spring Boot. Мы создаем приложение с целью установки Maven . После сборки мы запускаем сервер с пользовательской целью Maven spring-boot:run .

Чтобы убедиться, что сервер работает, мы можем нажать этот URL-адрес в нашем браузере:

http://localhost:8082/spring-boot-rest/auth/foos

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

3. Создание коллекции почтальона

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

Начнем с создания новой коллекции. Мы можем щелкнуть стрелку раскрывающегося списка на кнопке « Создать » и выбрать « Коллекция» :

./8142834dffb9797ee504622ec17a2ebb.png

Когда появится диалоговое окно CREATE A NEW COLLECTION , мы можем назвать нашу коллекцию « foo API test ». Наконец, мы нажимаем кнопку « Создать » , чтобы наша новая коллекция появилась в списке слева:

./92681579d1af16369e7813701e60e6af.png

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

4. Добавление POST-запроса

4.1. Создание нового запроса

Теперь, когда у нас есть пустая коллекция, давайте добавим запрос, который обращается к нашему API. В частности, давайте отправим сообщение POST на URI /auth/foos. Для этого мы открываем меню с многоточием в нашей коллекции и выбираем « Добавить запрос».

Когда появится диалоговое окно SAVE REQUEST , давайте дадим описательное имя, например « добавить foo». Затем нажмите кнопку Сохранить в foo API test .

Как только запрос создан, мы видим, что наша коллекция указывает на один запрос . Однако, если наша коллекция не была расширена, то мы еще не можем видеть запрос. В этом случае мы можем щелкнуть коллекцию, чтобы развернуть ее.

Теперь мы должны увидеть новый запрос, указанный в нашей коллекции. Мы можем заметить, что новый запрос по умолчанию представляет собой HTTP GET, а это не то, что нам нужно. Мы исправим это в следующем разделе:

./8068f113008707112cb1bb90c35c3dab.png

4.2. Редактирование запроса

Чтобы отредактировать запрос, щелкнем по нему, тем самым загрузив его во вкладку редактора запросов:

./d08273db6696ed4befbdd6ef1aecd800.png

Хотя редактор запросов имеет множество опций, нам пока нужны только некоторые из них.

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

Во-вторых, нам нужен URL. Справа от раскрывающегося списка методов находится текстовое поле для URL-адреса запроса. Итак, давайте введем это сейчас:

http://localhost:8082/spring-boot-rest/auth/foos

Последним шагом является предоставление тела сообщения. Под URL-адресом находится ряд заголовков вкладок. Мы щелкнем заголовок вкладки « Тело », чтобы перейти к редактору тела.

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

Наш сервис принимает данные JSON, поэтому мы выбираем необработанный переключатель . В раскрывающемся списке справа мы применяем тип контента JSON (application/json) .

После того, как кодировка и тип контента были установлены, мы добавляем наш контент JSON в текстовую область:

{
"name": "Transformers"
}

Наконец, давайте обязательно сохраним наши изменения, нажав Ctrl-S или нажав кнопку « Сохранить ». Кнопка « Сохранить » расположена справа от кнопки « Отправить ». После сохранения мы видим, что запрос был обновлен до POST в списке слева:

./c963a0b7e4603c6917e46de8bd7e96c4.png

5. Запуск запроса

5.1. Выполнение одного запроса

Чтобы выполнить один запрос, мы просто нажимаем кнопку « Отправить » справа от URL-адреса. Как только мы нажмем « Отправить», под панелью запроса откроется панель ответов. Возможно, потребуется прокрутить вниз, чтобы увидеть его:

./4e01ee7790594dcb0e8c84c6c6614177.png

Давайте рассмотрим наши результаты. В частности, в строке заголовка мы видим, что наш запрос выполнен успешно со статусом 201 Created . Кроме того, тело ответа показывает, что наша запись Transformers получила идентификатор 1.

5.2. Использование бегуна коллекций

В отличие от кнопки « Отправить », средство запуска коллекции может выполнить всю коллекцию целиком . Чтобы запустить средство запуска коллекции, мы наводим курсор на нашу тестовую коллекцию foo API и нажимаем стрелку вправо. На правой панели мы видим кнопку « Выполнить» , поэтому давайте нажмем ее:

./fd898bcbb3570f7567704b08501126a8.png

Когда мы нажимаем кнопку « Выполнить », бегун коллекции открывается в новом окне. Поскольку мы запустили его из нашей коллекции, раннер уже инициализирован для нашей коллекции:

./bb69a452281a63d3e30fcca1d033f455.png

Средство запуска коллекции предлагает параметры, влияющие на тестовый запуск, но в этом упражнении они нам не понадобятся. Давайте перейдем непосредственно к кнопке Run foo API test внизу и нажмем ее.

Когда мы запускаем сбор, представление меняется на Run Results . В этом представлении мы видим список тестов, которые отмечены зеленым цветом в случае успеха и красным в случае неудачи.

Несмотря на то, что наш запрос был отправлен, бегун указывает, что ноль тестов пройден и ноль тестов не пройден. Это потому, что мы еще не добавили тесты в наш запрос:

./1a745a538f7fb7f59210177d6276ad32.png

6. Тестирование ответа

6.1. Добавление тестов в запрос

Чтобы создать тест, вернемся к панели редактирования запроса, где мы построили наш метод POST. Мы нажимаем вкладку « Тесты », которая находится под URL-адресом. Когда мы это сделаем, появится панель Tests:

./03d0585593a213cf3c69b88a3af5e58c.png

В панели Tests пишем JavaScript, который будет выполняться при получении ответа от сервера.

Postman предлагает встроенные переменные, обеспечивающие доступ к запросу и ответу . Кроме того, с помощью синтаксиса require() можно импортировать ряд библиотек JavaScript .

В этом руководстве слишком много функций сценариев. Однако официальная документация Postman — отличный ресурс по этой теме.

Продолжим, добавив в наш запрос три теста:

pm.test("success status", () => pm.response.to.be.success );
pm.test("name is correct", () =>
pm.expect(pm.response.json().name).to.equal("Transformers"));
pm.test("id was assigned", () =>
pm.expect(pm.response.json().id).to.be.not.null );

Как мы видим, эти тесты используют глобальный модуль pm , предоставленный Postman . В частности, в тестах используются pm.test(), pm.expect() и pm.response .

Функция pm.test() принимает метку и функцию утверждения , например, expect() . Мы используем pm.expect() для утверждения условий содержимого ответа JSON.

Объект pm.response обеспечивает доступ к различным свойствам и операциям над ответом, возвращенным с сервера. Доступные свойства включают, среди прочего, статус ответа и содержимое JSON.

Как всегда, сохраняем наши изменения с помощью Ctrl-S или кнопки Сохранить .

6.2. Запуск тестов

Теперь, когда у нас есть тесты, давайте снова запустим запрос. При нажатии на кнопку « Отправить » результаты отображаются на вкладке « Результаты теста » панели ответов:

./9a4f544b0122a0ea4ec33f33dc4dabf7.png

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

./0a8afef6ce5d8ee48864ae6795c7bbb1.png

6.3. Просмотр консоли почтальона

Postman Console — полезный инструмент для создания и отладки скриптов. Мы можем найти консоль в меню « Вид » с названием пункта « Показать консоль почтальона» . При запуске консоль открывается в новом окне.

Пока консоль открыта, она записывает все HTTP-запросы и ответы . Кроме того, когда скрипты используют console.log(), Postman Console отображает следующие сообщения:

./37ad4c6df03fc8d026d4d2be9c426b3b.png

7. Создание последовательности запросов

До сих пор мы сосредоточились на одном HTTP-запросе. Теперь давайте посмотрим, что мы можем сделать с несколькими запросами. Соединяя вместе серию запросов, мы можем смоделировать и протестировать рабочий процесс клиент-сервер .

В этом разделе давайте применим полученные знания для создания последовательности запросов. В частности, мы добавим еще три запроса для выполнения после уже созданного запроса POST. Это будет GET, DELETE и, наконец, еще один GET.

7.1. Захват значений ответов в переменных

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

Чтобы зафиксировать этот идентификатор, мы добавим еще одну строку в конец тестового сценария POST-запроса:

pm.variables.set("id", pm.response.json().id);

Функция pm.variables.set() принимает значение и присваивает его временной переменной . В этом случае мы создаем переменную id для хранения значения id нашего объекта. После установки мы можем получить доступ к этой переменной в последующих запросах.

7.2. Добавление GET-запроса

Теперь, используя методы из предыдущих разделов, давайте добавим запрос GET после запроса POST.

С помощью этого запроса GET мы получим тот же экземпляр foo , который был создан запросом POST . Назовем этот GET-запрос как « get a foo ».

URL запроса GET:

http://localhost:8082/spring-boot-rest/auth/foos/{{id}}

В этом URL-адресе мы ссылаемся на переменную id , которую мы ранее установили во время запроса POST. Таким образом, запрос GET должен получить тот же экземпляр, который был создан POST.

Переменные, когда они появляются вне скриптов, указываются с использованием синтаксиса с двойной фигурной скобкой {{id}} .

Поскольку тела для GET-запроса нет, перейдем непосредственно к вкладке Tests . Поскольку тесты похожи, мы можем скопировать тесты из POST-запроса, а затем внести несколько изменений.

Во- первых, нам не нужно снова устанавливать переменную id , поэтому не будем копировать эту строку.

Во-вторых, мы знаем, какой идентификатор ожидать на этот раз, поэтому давайте проверим этот идентификатор. Для этого мы можем использовать переменную id :

pm.test("success status", () => pm.response.to.be.success );
pm.test("name is correct", () =>
pm.expect(pm.response.json().name).to.equal("Transformers"));
pm.test("id is correct", () =>
pm.expect(pm.response.json().id).to.equal(pm.variables.get("id")) );

Поскольку синтаксис с двойными скобками недопустим в JavaScript, мы используем функцию pm.variables.get() для доступа к переменной id .

Наконец, давайте сохраним изменения, как мы делали это раньше.

7.3. Добавление запроса на удаление

Далее мы добавим запрос DELETE, который удалит объект foo с сервера.

Мы продолжим, добавив новый запрос после GET и установив его метод на DELETE. Мы можем назвать этот запрос « удалить foo ».

URL-адрес удаления идентичен URL-адресу GET:

http://localhost:8082/spring-boot-rest/auth/foos/{{id}}

У ответа не будет тела для тестирования, но мы можем протестировать код ответа . Поэтому запрос DELETE будет иметь только один тест:

pm.test("success status", () => pm.response.to.be.success );

7.4. Проверка УДАЛЕНИЯ

Наконец, давайте добавим еще одну копию запроса GET, чтобы убедиться, что DELETE действительно работает. На этот раз давайте продублируем наш первый запрос GET вместо того, чтобы создавать запрос с нуля.

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

К имени запроса-дубликата будет добавлено слово « Копировать ». Давайте переименуем его в « проверить удаление », чтобы избежать путаницы. Параметр « Переименовать » доступен, если щелкнуть запрос правой кнопкой мыши.

По умолчанию дубликат запроса появляется сразу после исходного запроса. В результате нам нужно будет перетащить его ниже запроса DELETE.

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

Мы скопировали запрос GET и переместили его после DELETE, но еще не обновили тесты. Поскольку запрос DELETE должен был удалить объект, тесты должны завершиться неудачно.

Давайте обязательно сохраним все наши запросы, а затем нажмем « Повторить попытку » в средстве запуска коллекции. Как и ожидалось, наши тесты провалились:

./cfecd0d1f16c3a4874feaee5c4a2b259.png

Теперь, когда наш краткий экскурс завершен, давайте исправим тесты.

Просмотрев неудачные тесты, мы видим, что сервер отвечает статусом 500. Поэтому мы изменим статус в нашем тесте.

Кроме того, просмотрев ошибочный ответ в Postman Console , мы узнаем, что ответ включает в себя свойство причины . Кроме того, свойство причины содержит строку « Нет значения ». Мы также можем проверить это:

pm.test("status is 500", () => pm.response.to.have.status(500) );
pm.test("no value present", () =>
pm.expect(pm.response.json().cause).to.equal("No value present"));

7.5. Запуск полной коллекции

Теперь, когда мы добавили все запросы, давайте запустим полную коллекцию в средстве запуска коллекции:

./d460473aa6563e712334299fc6097f0c.png

Если все прошло по плану, у нас должно быть девять успешных тестов.

8. Экспорт и импорт коллекции

Хотя Postman хранит наши коллекции в частном локальном месте, мы можем захотеть поделиться этой коллекцией . Для этого мы экспортируем коллекцию в файл JSON .

Команда « Экспорт » доступна в меню с многоточием коллекции. Когда будет предложено указать версию файла JSON, давайте выберем последнюю рекомендуемую версию.

После того, как мы выберем версию файла, Postman предложит указать имя файла и местоположение для экспортируемой коллекции. Например, мы можем выбрать папку в нашем проекте GitHub.

Чтобы импортировать ранее экспортированную коллекцию, мы используем кнопку Импорт . Мы можем найти его на панели инструментов главного окна Postman. Когда Postman запрашивает расположение файла, мы можем перейти к файлу JSON, который хотим импортировать.

Стоит отметить, что Postman не отслеживает экспортированные файлы. В результате Postman не показывает внешние изменения, пока мы не импортируем коллекцию повторно.

9. Заключение

В этой статье мы использовали Postman для создания полуавтоматических тестов для REST API. Хотя эта статья служит введением в основные функции Postman, мы лишь коснулись его возможностей. Онлайн - документация Postman — ценный ресурс для более глубокого изучения.

Коллекция, созданная в этом руководстве, доступна на GitHub .