Проверка response данных

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 содержит тело ответа, которое можно валидировать.
  • Cypress автоматически преобразует JSON-ответ в объект JavaScript.

Для 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-schema

Cypress использует библиотеку 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);

Преимущества использования схем:

  • Быстро выявляются отсутствующие поля.
  • Проверка типов данных становится явной.
  • Легко поддерживать тесты при изменении API.

Перехват и проверка запросов через 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, так и на уровне взаимодействия с интерфейсом.