Разделы портала

Онлайн-тренинги

.
Основы Cypress: тестирование API
01.06.2022 00:00

Автор: Филип Рик (Filip Hric)
Оригинал статьи
Перевод: Ольга Алифанова

Если вы когда-либо тестировали API через Postman или иной инструмент, то это будет элементарной задачей для вас. Cypress – отличный инструмент тестирования, который также может быть полезен при тестировании API. В сегодняшней статье я пройдусь по основам создания API-теста в Cypress.

Команда .request()

Эта команда – центр тестирования API. Для отправки простого запроса методом GET можно сделать вот что:

cy.request('/api/boards')

Заметьте, что вам не нужно добавлять метод. Cypress оптимизирует свои команды для максимальной читабельности, поэтому при такой записи запроса он автоматически будет отправлен методом GET.

Если вы передаете два аргумента в команду .request(), первый из них будет определен как метод, а второй – как url.

cy.request('DELETE', '/api/boards/9873789121')

Я также не задаю полный url. Это связано с тем, что /api/boards будет автоматически добавлено к baseUrl, заданному в cypress.json.

Команда .request() принимает максимум три аргумента. Третий – это тело запроса.

cy.request('POST', '/api/boards', {
name: 'space travel plan'
})

Этот простой синтаксис очень полезен, если вы хотите отправить пачку запросов к базе данных, чтобы быстро настроить данные для UI-теста. Мой друг Фурбо написал об этом отличную статью.

Передача множества атрибутов в команду .request()

Если вы хотите передать дополнительные опции или просто дать побольше контекста команде .request(), то можете передать единый объект. Предыдущий запрос можно записать так:

cy.request({
method: 'POST',
url: '/api/boards',
body: {
name: 'space travel plan'
}
})

Это также дает возможность передавать больше опций – например, заголовки или параметры запроса:

cy.request({
method: 'GET',
url: '/api/boards',
qs: {
starred: 'true'
},
headers: {
accept: 'application/json'
}
})

Получение данных из запроса

После того, как запрос получил ответ от сервера, вы можете получить доступ к этой информации, используя команду .then(). Это вернет различные атрибуты – тело ответа, код статуса, длительность, и т. д.

cy.request({
method: 'POST',
url: '/api/boards',
body: {
name: 'space travel plan'
}
}).then( (board) => {
 
console.log(board.status) // 201
console.log(board.duration) // 11
console.log(board.body)
/*
{
"name": "new board",
"id": 39871447524,
"starred": false,
"created": "2022-01-17"
}
*/
})

Алиас board, который используется как параметр в функции .then(), можно пропустить, если вы используете деструктуризацию.

cy.request({
method: 'POST',
url: '/api/boards',
body: {
name: 'space travel plan'
}
}).then( ({ status }) => {
console.log(status) // 201
})

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

Если вы хотите использовать данные запроса в другом месте теста, посмотрите эту статью о работе с данными API, или эту – об использовании переменных в Cypress.

Тестирование данных ответа

Теперь, когда мы получили данные от сервера, можно переходить к их тестированию. У Cypress есть библиотека chai, которую можно использовать внутри команды .then()

cy.request({
method: 'POST',
url: '/api/boards',
body: {
name: 'space travel plan'
}
}).then( ({ status }) => {
expect(status).to.eq(201)
})

Тело ответа обычно хранится в формате JSON – если вам нужно найти определенный элемент в ответе и проверить его, вам нужен правильный путь. Я подробно писал об этом ранее, но простой пример будет выглядеть примерно так:

cy.request({
method: 'GET',
url: '/api/boards',
}).then( ({ body }) => {
expect(body).to.have.length(2) // проверка количества элементов
expect(body[0].name).to.eq('space travel plan') // проверка первого элемента в массиве
})

Вы можете проверять различные атрибуты API-ответа, так как библиотека chai довольно гибкая. К примеру, можно проверить тип контента, наличие определенных элементов, или создать свою собственную функцию для проверки значения.

cy.request({
method: 'GET',
url: '/api/boards',
}).then( ({ body }) => {
expect(body.length).to.be.greaterThan(1) // более одного элемента в списке
expect(body[0].name).to.be.a('string') // текст 'space travel plan' – это строка
expect(body[0].id).to.satisfy((num) => { return num > 0 }) // id должен быть больше 0
})

Использование плагина cy-api

Cypress открывает браузер при каждом прогоне теста, и это надо иметь в виду, используя Cypress для тестирования API. Вам также нужна консоль браузера, чтобы рассмотреть ответ Cypress детально.

Однако при использовании плагина cy-api запрос и ответ рендерятся в окне браузера, поэтому можно легко наблюдать за API даже в GUI-режиме. Этот плагин добавляет команду .api() в вашу библиотеку Cypress, и ее синтаксис очень похож на синтаксис команды .request(). Единственное значимое отличие в том, что вы не можете использовать простой синтаксис, как в начале статьи – вам нужно каждый раз передавать полноценный объект.

cy
.api({
method: 'POST',
url: '/api/boards',
body: { name: 'new board' }
})

Этот тест покажет вам вот что:


Надеюсь, вам понравилось!

Обсудить в форуме