Cypress предоставляет мощные средства для работы с HTTP-запросами и проверки данных, получаемых от серверов. Важной частью автоматизированного тестирования является не только проверка отображения элементов на странице, но и контроль содержимого ответа API, корректности структуры данных и их соответствия ожиданиям.
cy.request()Метод cy.request() позволяет отправлять HTTP-запросы
напрямую, без участия пользовательского интерфейса. Он используется для
проверки API, подготовки тестовых данных или валидации ответов
сервера.
Пример базового GET-запроса:
cy.request('GET', '/api/users/1')
.then((response) => {
expect(response.status).to.eq(200);
expect(response.body).to.have.property('id', 1);
expect(response.body).to.have.property('name').and.be.a('string');
});
Ключевые моменты:
response.status проверяет HTTP-статус.response.body содержит тело ответа, которое можно
валидировать.Для POST-запросов можно передавать тело запроса и заголовки:
cy.request({
method: 'POST',
url: '/api/users',
body: { name: 'John', email: 'john@example.com' },
headers: { 'Content-Type': 'application/json' }
}).then((response) => {
expect(response.status).to.eq(201);
expect(response.body).to.include({ name: 'John' });
});
chai и
chai-json-schemaCypress использует библиотеку Chai для ассертов, что позволяет проверять структуру объектов и соответствие схемам JSON.
Пример проверки схемы JSON:
const userSchema = {
title: 'User Schema',
type: 'object',
required: ['id', 'name', 'email'],
properties: {
id: { type: 'number' },
name: { type: 'string' },
email: { type: 'string' }
}
};
cy.request('/api/users/1')
.its('body')
.should('matchSchema', userSchema);
Преимущества использования схем:
cy.intercept()Метод cy.intercept() позволяет перехватывать сетевые
запросы, что особенно полезно для проверки данных на страницах, которые
динамически подгружаются через AJAX.
Пример перехвата GET-запроса:
cy.intercept('GET', '/api/users/*').as('getUser');
cy.visit('/users/1');
cy.wait('@getUser').then((interception) => {
expect(interception.response.statusCode).to.eq(200);
expect(interception.response.body).to.have.property('id', 1);
});
Особенности работы:
cy.wait('@alias') ожидает выполнения запроса.interception.response.body содержит тело ответа.Для подмены ответа сервера используется fixture:
cy.intercept('GET', '/api/users/1', { fixture: 'user.json' }).as('getUser');
API часто возвращает списки объектов. Cypress позволяет проверять количество элементов, наличие конкретных значений и свойства каждого объекта.
Пример проверки массива пользователей:
cy.request('/api/users')
.its('body')
.should('be.an', 'array')
.and('have.length.greaterThan', 0)
.each((user) => {
expect(user).to.have.all.keys('id', 'name', 'email');
expect(user.id).to.be.a('number');
expect(user.email).to.match(/@/);
});
Проверка отдельных элементов массива помогает выявить ошибки формирования данных на сервере.
then()Cypress построен на промисах, но использует синхронный стиль кода
через команды цепочки. Для сложных проверок, например, связанных
нескольких запросов, применяются вложенные then():
cy.request('/api/users/1').then((userResponse) => {
const userId = userResponse.body.id;
cy.request(`/api/orders?userId=${userId}`).then((ordersResponse) => {
expect(ordersResponse.status).to.eq(200);
expect(ordersResponse.body).to.be.an('array');
ordersResponse.body.forEach(order => {
expect(order.userId).to.eq(userId);
});
});
});
Преимущество такого подхода: можно проверять зависимые данные между несколькими API-запросами.
Часто требуется проверка, что поле соответствует определённому диапазону или условию:
cy.request('/api/users/1')
.its('body')
.should((user) => {
expect(user.age).to.be.within(18, 65);
expect(user.isActive).to.be.true;
});
Использование .should() с функцией позволяет выполнять
комплексные проверки сразу на нескольких полях объекта.
Для полного покрытия API важно проверять не только успешные ответы, но и ошибки:
cy.request({
method: 'GET',
url: '/api/users/9999',
failOnStatusCode: false
}).then((response) => {
expect(response.status).to.eq(404);
expect(response.body).to.have.property('error', 'User not found');
});
Параметр failOnStatusCode: false предотвращает падение
теста при получении ошибки, позволяя проводить ассерты на содержимое
ответа.
Cypress поддерживает передачу заголовков, токенов и куки для проверки защищённых API:
cy.request({
method: 'GET',
url: '/api/profile',
headers: { Authorization: `Bearer ${token}` }
}).then((response) => {
expect(response.status).to.eq(200);
expect(response.body).to.have.property('email');
});
Это позволяет интегрировать проверку response данных в полноценные сценарии авторизации и работы с сессиями.
Проверка response данных в Cypress сочетает в себе удобный синтаксис,
мощные средства ассертов и возможность детального контроля структуры и
содержания данных. Использование cy.request(),
cy.intercept(), схем JSON и цепочек проверок обеспечивает
высокую надёжность тестов и позволяет выявлять ошибки как на уровне API,
так и на уровне взаимодействия с интерфейсом.