Cypress предоставляет мощный набор инструментов для тестирования веб-приложений, включая возможность взаимодействия с API. Работа с HTTP-запросами позволяет тестировать как фронтенд, так и бэкенд, проверяя корректность ответов сервера и интеграцию компонентов.
cy.request()Метод cy.request() является базовым инструментом для
отправки HTTP-запросов. Он поддерживает все стандартные методы:
GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.
Синтаксис:
cy.request({
method: 'GET', // метод запроса
url: '/api/users', // путь или полный URL
headers: {
'Authorization': 'Bearer token'
},
body: {
key: 'value'
},
failOnStatusCode: false // отключает автоматическую ошибку при статусе != 2xx
});
Особенности:
failOnStatusCode: true тест падает, если сервер
возвращает код ошибки (по умолчанию true).status,
body, headers.GET-запросы используются для получения данных. Проверка включает статус ответа, формат данных и содержимое.
cy.request('GET', '/api/users')
.then((response) => {
expect(response.status).to.eq(200);
expect(response.body).to.have.property('users').and.be.an('array');
expect(response.headers).to.have.property('content-type').and.include('application/json');
});
Ключевые моменты:
qs:cy.request({
method: 'GET',
url: '/api/users',
qs: { page: 2, limit: 10 }
});
POST-запросы предназначены для создания ресурсов. Проверка должна включать корректность данных и статус ответа (обычно 201 Created).
cy.request({
method: 'POST',
url: '/api/users',
body: {
name: 'Ivan',
email: 'ivan@example.com'
}
}).then((response) => {
expect(response.status).to.eq(201);
expect(response.body).to.include({ name: 'Ivan', email: 'ivan@example.com' });
});
Особенности:
body автоматически сериализуется в JSON.failOnStatusCode: false:cy.request({
method: 'POST',
url: '/api/users',
body: {},
failOnStatusCode: false
}).then((response) => {
expect(response.status).to.eq(400);
});
PUT используется для полной замены ресурса, PATCH — для частичного обновления.
Пример PUT:
cy.request({
method: 'PUT',
url: '/api/users/1',
body: {
name: 'Ivan Updated',
email: 'ivan.updated@example.com'
}
}).then((response) => {
expect(response.status).to.eq(200);
expect(response.body.name).to.eq('Ivan Updated');
});
Пример PATCH:
cy.request({
method: 'PATCH',
url: '/api/users/1',
body: { name: 'Ivan Patched' }
}).then((response) => {
expect(response.status).to.eq(200);
expect(response.body.name).to.eq('Ivan Patched');
});
Особенности:
DELETE удаляет ресурсы. Проверка должна включать статус ответа (204 No Content) и последующую попытку получить удалённый ресурс.
cy.request('DELETE', '/api/users/1')
.then((response) => {
expect(response.status).to.eq(204);
});
cy.request({
method: 'GET',
url: '/api/users/1',
failOnStatusCode: false
}).then((response) => {
expect(response.status).to.eq(404);
});
Cypress позволяет передавать кастомные заголовки и токены аутентификации.
cy.request({
method: 'GET',
url: '/api/protected',
headers: {
Authorization: 'Bearer some-token',
'X-Custom-Header': 'value'
}
});
Особенности:
Cypress поддерживает последовательное выполнение запросов с проверкой промежуточных результатов.
cy.request('POST', '/api/users', { name: 'Anna' })
.then((postResponse) => {
expect(postResponse.status).to.eq(201);
const userId = postResponse.body.id;
cy.request('GET', `/api/users/${userId}`)
.then((getResponse) => {
expect(getResponse.body.name).to.eq('Anna');
});
});
Особенности:
Для тестирования ошибок полезно использовать
failOnStatusCode: false. Это позволяет проверять
статусы 4xx и 5xx, а также сообщения об ошибках
сервера.
cy.request({
method: 'GET',
url: '/api/unknown',
failOnStatusCode: false
}).then((response) => {
expect(response.status).to.eq(404);
expect(response.body.message).to.eq('Resource not found');
});
Cypress автоматически выводит информацию о каждом
cy.request() в командной панели. Для дополнительного
логирования можно использовать .then() и
console.log:
cy.request('GET', '/api/users')
.then((response) => {
console.log('Response body:', response.body);
});
cy.request() работает не только с JSON, но и с
формой application/x-www-form-urlencoded,
multipart/form-data, текстовыми и бинарными
данными.
cy.request({
method: 'POST',
url: '/api/upload',
body: { file: Cypress.Buffer.from('file content') },
headers: { 'Content-Type': 'multipart/form-data' }
});
failOnStatusCode: false для тестирования
ошибок.headers
и qs для гибкости.Работа с HTTP-методами в Cypress обеспечивает надежное тестирование API и интеграцию с фронтендом, позволяя выявлять ошибки на ранних этапах разработки.