Тестируем API без головной боли: автоматизация с Postman
API-тестирование — один из важнейших этапов разработки, позволяющий убедиться, что серверная часть приложения работает корректно. Однако ручное тестирование каждого сценария может отнимать слишком много времени. Здесь на помощь приходит Postman — популярный инструмент для работы с API. Его возможности автоматизации позволяют существенно ускорить процесс тестирования, делая его удобным даже для начинающих специалистов.
Тестирование API может быть выполнено с помощью различных способов автоматизации. В предыдущей статье мы рассмотрели способы с помощью RestAssured и Postman. Здесь рассмотрим автоматизацию тестирования с переиспользованием предварительных запросов для удобного построения автоматизации в Postman, запуском автотестов через Newman и публикации их результатов в системе управление тестированием Test IT. Этот подход будет полезен начинающим специалистам в автоматизированном тестировании и ручным тестировщикам.
Коротко о возможностях автоматизации в Postman
Postman предоставляет широкий спектр инструментов для автоматизации тестирования API. Среди ключевых возможностей:
-
Скрипты Pre-request и Tests, позволяющие автоматически подготавливать данные и проверять результаты.
-
Коллекции запросов, которые можно запускать пакетно.
-
Интеграция с CI/CD, обеспечивающая тестирование на этапе сборки.
-
Переменные среды, которые упрощают настройку тестов под разные окружения.
-
Генерация отчетов и интеграция с внешними системами управления тестированием.
Описание тестового API с CRUD-операциями
Для демонстрации возможностей автоматизации используем тестовый проект с https://github.com/stillwork-bit/test-api
API предоставляет стандартные CRUD-операции для управления пользователями:
1. Создание пользователя
-
Метод: POST
-
Путь: /api/users
-
Body:
{ "email": "{{user_email}}", "name": "{{user_name}}" }
2. Обновление пользователя
-
Метод: PUT
-
Путь: /api/users/{{id_user}}, где id_user- id пользователя
-
Body:
{ "email": "{{user_email_update}}", "name": "{{user_name_update}}" }
3. Получение пользователя по ID
-
Метод: GET
-
Путь: /api/users/{{id_user}}, где id_user- id пользователя
4. Получение всех пользователей
-
Метод: GET
-
Путь: /api/users
5. Удаление пользователя
-
Метод: DELETE
-
Путь: /api/users/{{user_name}}, где user_name - имя пользователя
Создание коллекции Postman и переменных окружения
Создайте в Postman коллекцию со структурой:
TestAPI
├── Option, PreRequest, Test
└── Collection
Описание каталогов:
-
TestAPI: секция для инициализации базовых переменных в Pre-request.
-
Option, PreRequest, Test: подготовка HTTP Options для создания и удаления пользователя.
-
Collection: логирование названий запросов и выполнение автотестов.
Также в нашем проекте будет подготовлена переменная среды test_api с переменными:
-
url — адрес подключения со значением http://localhost:
-
port — порт подключения со значением 9999.
-
logLevel — уровень логирования со значением info
Эта структура автоматизации в Рostman позволяет на каждом уровне определить необходимые скрипты и переменные для переиспользования в запросах. Например, при пользовательском тестировании API вместо уровня Collection может быть любое количество контроллеров или других элементов.
Пишем автотесты в Postman
Подготовка PreRequest коллекции TestAPI
Во вкладке PreRequest на уровне коллекции TestAPI можно инициализировать переменные для использования в тестах Postman. В примере ниже я написал функцию для получения рандомного значения (не забываем про динамические переменные, реализованные в Postman, чтобы не изобретать колесо), а также условие для отображения заполненных глобальных переменных.
Код PreRequest:
function randInt(min, max) { return Math.round((Math.random() * Math.abs(max - min)) + min); return _.random(1, 1000); } //-------------------------------- //Переменные для user var user_name = "user_name_"+ randInt(1, 10000); var user_email = "user_email_"+ randInt(1, 10000) + "@test.com"; var user_name_update = "user_name_update"+ randInt(1, 10000); var user_email_update = "user_email_update_"+ randInt(1, 10000) + "@test.com"; pm.globals.set("user_name", user_name); pm.globals.set("user_email", user_email); pm.globals.set("user_name_update", user_name_update); pm.globals.set("user_email_update", user_email_update); //Логирование переменных if ("debug" == pm.environment.get("logLevel")) { console.log(pm.globals.get('user_name')) console.log(pm.globals.get('user_email')) console.log(pm.globals.get('user_name_update')) console.log(pm.globals.get('user_email_update')) }
Подготовка Option, PreRequest, Test
В Option, PreRequest, Test во вкладке PreRequest подготовлены option для запросов в тестах с публикацией их в глобальные переменные.
Код PreRequest:
//----------------------------------------------------------------------- //Создание user let createUserOption = { url: pm.environment.get('url') + pm.environment.get('port') + "/api/users", method: 'POST', header: { 'content-type': 'application/json' }, body: { mode: 'raw', raw: JSON.stringify({ "email": pm.environment.get('user_email'), "name": pm.environment.get('user_name') }) } }; pm.globals.set('createUserOption', createUserOption); //----------------------------------------------------------------------- //Удаление user let deleteUserOption = { url: pm.environment.get('url') + pm.environment.get('port') + "/api/users/"+pm.globals.get('user_name'), method: 'DELETE', header: { 'content-type': 'application/json' } }; pm.globals.set('deleteUserOption', deleteUserOption);
Подготовка Collection
Удобно, если в консоли Postman логируется название запроса, который мы выполняем. Для этого в PreRequest на уровне Collection подготовим скрипт для его отображения.
Код PreRequest:
console.log("Running: "+ pm.info.requestName);
Написание запросов Postman с RreRequest и Tests
1. Создайте запрос Get all users с заполненным test:
// Проверка статус-кода pm.test("Status code is 200", function () { pm.response.to.have.status(200); });
2. Создайте запрос Get user by Id c path {{url}}{{port}}/api/users/161 (в моем случае был id пользователя =161) с заполненным test:
// Проверка статус-кода pm.test("Status code is 200", function () { pm.response.to.have.status(200); });
3. Создайте запрос Post new user c path {{url}}{{port}}/api/users с заполненным test:
let user_request = JSON.parse(pm.request.body.raw); let user_response = pm.response.json(); console.log("Request JSON:", user_request) console.log("Response JSON:", user_response) // Проверка статус-кода pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); pm.test("Удаление тестового пользователя", function () { pm.sendRequest(pm.globals.get('deleteUserOption'), function (err, res) { pm.expect(res.code).to.equal(204) }); })
Body запроса raw json:
{ "email": "{{user_email}}", "name": "{{user_name}}" }
4. Создайте запрос Put update user c path {{url}}{{port}}/api/users/{{id_user}} с заполненным prerequest и test
PreRequest:
pm.test("Создание тестового пользователя", function () { pm.sendRequest(pm.globals.get('createUserOption'), function (err, res) { pm.expect(res.code).to.equal(200); let responsePrePrequestJson = JSON.parse(JSON.stringify(res.json())); let id_user = responsePrePrequestJson.id; pm.collectionVariables.set("responsePrePrequestJson", responsePrePrequestJson); pm.collectionVariables.set("id_user", id_user); console.log("ResponsePrePrequestJson JSON:", responsePrePrequestJson) console.log("ID USER :", id_user) }); })
Test:
let user_request = JSON.parse(pm.request.body.raw); let user_response = pm.response.json(); console.log("Request JSON:", user_request) console.log("Response JSON:", user_response) // Проверка статус-кода pm.test("Проверка обновления пользователя SC=200", function () { pm.response.to.have.status(200); }); pm.test("Удаление тестового пользователя", function () { pm.sendRequest(pm.globals.get('deleteUserOption'), function (err, res) { pm.expect(res.code).to.equal(204) }); })
Body запроса raw json:
{ "email": "{{user_email_update}}", "name": "{{user_name_update}}" }
5. Создайте запрос Delete delete user c path {{url}}{{port}}/api/users/{{user_name}} с заполненным prerequest и test
PreRequest:
pm.test("Создание тестового пользователя", function () { pm.sendRequest(pm.globals.get('createUserOption'), function (err, res) { pm.expect(res.code).to.equal(200); let responsePrePrequestJson = JSON.parse(JSON.stringify(res.json())); pm.collectionVariables.set("responsePrePrequestJson", responsePrePrequestJson); console.log("ResponsePrePrequestJson JSON:", responsePrePrequestJson) }); })
Test:
// Проверка статус-кода pm.test("Status code is 204", function () { pm.response.to.have.status(204); });
Проверка работы запросов
При этом подходе на примере запроса PUT для обновления тестового запроса видны несколько этапов выполнения:
-
Подготовка тестовых данных путем создания тестового пользователя.
-
Выполнение тестового запроса по обновлению тестового пользователя.
-
Удаление тестового пользователя.
Также у вас отрабатывают тесты на каждом этапе:
Как еще можно улучшить проект автоматизации в Postman и убрать дублирование?
-
Вынести проверку status code за пределы запроса (на уровень Collection)
-
Сделать проверку полей
-
Подготовить ID пользователя для запроса Get By ID
и другие шаги.
Публикация автотестов в Test IT
Подготовьте параметры перед публикацией автотестов:
-
Запустите тестовый проект из GitHub.
-
Подготовьте коллекцию запросов в Postman.
-
Экспортируйте тестовую коллекцию и переменные седы в удобный для вас каталог.
-
Для проверки тест-кейсов экспорта автотестов Postman в Test IT вам потребуется проект. Если у вас его нет, то зарегистрируйтесь и создайте проект — например, test-api.
-
Скопируйте project ID и configuration ID из вашего проекта в Test IT. Можно собрать ID из консоли разработчика в разделе Network в запросах конфигурации и переходе в тестовый проект.
6. Скопируйте токен вашего пользователя из Test IT для публикации результатов автотестов.
7. Установите Newman: npm install -g newman.
Создание отчета c помощью Newman + Allure Report и публикация в Test IT
1. Выполните запуск автотестов Postman через Newman с помощью команды для формирования отчета Allure:
newman run TestAPI.postman_collection.json -e test_api.postman_environment.json -r allure --reporter-allure-export ./allure-results
2. Установите импортер Allure от Test IT для отчета:
pip install testit-importer-allure
3. Выполните экспорт результатов в TMS Test IT с помощью команды:
testit -pt [TMS TOKEN] -u [URL TESTIT] \ -pi [Ваш PROJECT_ID] -ci [Ваш CONFIGURATIN_ID] -rd [Путь к каталогу с отчетом Allure]
В Test IT появится запуск автотестов с вашими тест-кейсами и их статусом выполнения:
Создание отчета c помощью Newman + JUNIT и публикация в Test IT
1. Выполните запуск автотестов Postman через Newman с помощью команды для формирования отчета junit-export results:
newman run TestAPI.postman_collection.json -e test_api.postman_environment.json -r cli,junit --reporter-junit-export results/test-results.xml
2. Установите testit-cli:
pip install testit-cli
3. Выполните экспорт результатов в Test IT с помощью команды:
testit results import --token [TMS TOKEN] --url [URL TESTIT] \ --project-id [Ваш PROJECT_ID] --configuration-id [Ваш CONFIGURATIN_ID] \ --testrun-name "Postman test run" --results [Путь к каталогу с отчетом junit] В Test IT появится запуск автотестов с вашими тест-кейсами и их статусом выполнения:
Подробнее об импорте результатов автотестов в Test IT читайте в документации по ссылке.
Результаты и преимущества
В результате мы не только реализовали автотесты в Postman, но и настроили их запуск и публикацию в системе управления тестированием Test IT. Ознакомьтесь с результатом обновления тестового пользователя и списком выполненных шагов:
Это дает нам следующие преимущества:
-
Упрощение работы: Postman позволяет быстро автоматизировать даже сложные сценарии.
-
Скорость: Использование автоматизации уменьшает затраты времени на ручное тестирование.
-
Интеграция: Возможность интеграции с CI/CD и системами управления тестами.
Начать автоматизацию в Postman — это первый шаг к более быстрому и качественному тестированию API. С Test IT вы сможете эффективно управлять результатами и улучшать процессы тестирования.
Оцените возможности Test IT прямо сейчас на бесплатном тарифе