Проверка request payload

Cypress предоставляет мощные средства для перехвата и проверки сетевых запросов, что позволяет проводить детальное тестирование API и фронтенд-взаимодействий. Одной из ключевых задач является проверка request payload — данных, которые клиент отправляет на сервер.

Перехват запросов с cy.intercept

Метод cy.intercept позволяет перехватывать HTTP-запросы и работать с ними. Он заменил устаревший cy.route и обладает более гибкими возможностями:

cy.intercept('POST', '/api/users').as('createUser');
  • Первый параметр — HTTP-метод (GET, POST, PUT, DELETE и т.д.).
  • Второй параметр — URL запроса или маска (можно использовать регулярные выражения).
  • as('alias') создаёт удобное имя для последующего обращения к запросу.

Проверка тела запроса

Для проверки payload после отправки запроса используется метод cy.wait с ссылкой на alias:

cy.wait('@createUser').then((interception) => {
    expect(interception.request.body).to.deep.equal({
        name: 'John Doe',
        email: 'john.doe@example.com',
        role: 'admin'
    });
});
  • interception.request.body содержит тело запроса в формате JSON.
  • expect(...).to.deep.equal(...) проверяет полное соответствие объекта.

Если payload может содержать динамические данные (например, timestamp или id), рекомендуется использовать частичное сравнение:

cy.wait('@createUser').its('request.body').should('include', {
    role: 'admin'
});

should('include', {...}) проверяет только указанные поля, игнорируя остальные.

Перехват запросов с динамическими параметрами

Иногда URL запроса содержит динамические части, например /api/users/123. В таких случаях удобно использовать регулярные выражения:

cy.intercept('POST', /\/api\/users\/\d+/).as('updateUser');
cy.wait('@updateUser').then((interception) => {
    expect(interception.request.body).to.have.property('email', 'new.email@example.com');
});

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

Проверка формата и структуры payload

Кроме проверки значений, важно убедиться, что структура данных соответствует требованиям:

cy.wait('@createUser').then(({ request }) => {
    expect(request.body).to.have.all.keys('name', 'email', 'role');
    expect(request.body.name).to.be.a('string');
    expect(request.body.email).to.match(/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/);
});
  • have.all.keys проверяет наличие всех указанных ключей.
  • to.be.a('string') и регулярные выражения проверяют типы и формат полей.

Модификация request payload перед отправкой

Cypress позволяет перехватывать запросы и изменять их payload перед отправкой на сервер:

cy.intercept('POST', '/api/users', (req) => {
    req.body.role = 'tester';
}).as('modifiedCreateUser');

cy.get('form').submit();
cy.wait('@modifiedCreateUser').its('request.body').should('have.property', 'role', 'tester');

Это полезно для тестирования различных сценариев без изменения фронтенд-кода.

Проверка нескольких запросов

Если страница отправляет несколько запросов подряд, можно перехватывать и проверять их отдельно:

cy.intercept('POST', '/api/orders').as('createOrder');
cy.intercept('POST', '/api/payments').as('createPayment');

cy.get('#submit-order').click();

cy.wait('@createOrder').its('request.body').should('include', { itemId: 42 });
cy.wait('@createPayment').its('request.body').should('include', { amount: 100 });

Каждый alias позволяет работать с конкретным запросом и его payload независимо.

Логирование payload

Для отладки удобно выводить тело запроса в консоль:

cy.wait('@createUser').then((interception) => {
    console.log('Request payload:', interception.request.body);
});

Это упрощает анализ сложных объектов и выявление проблем с данными.

Практические рекомендации

  • Использовать alias для всех критичных запросов, чтобы облегчить их проверку.
  • Проверять не только значения полей, но и их типы и структуру.
  • Для динамических данных использовать частичное сравнение или регулярные выражения.
  • При необходимости изменять payload через callback req вместо редактирования фронтенд-кода.
  • Логировать payload при сложных сценариях тестирования.

Проверка request payload в Cypress позволяет создавать надёжные, детализированные тесты, полностью контролируя данные, отправляемые клиентом на сервер.