Работа с различными HTTP-методами

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-запросов

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');
  });

Ключевые моменты:

  • GET-запросы не должны изменять состояние сервера.
  • Можно передавать параметры через объект qs:
cy.request({
  method: 'GET',
  url: '/api/users',
  qs: { page: 2, limit: 10 }
});

Тестирование POST-запросов

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 используется для полной замены ресурса, 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');
});

Особенности:

  • PUT требует полный объект, иначе отсутствующие поля будут перезаписаны.
  • PATCH позволяет обновлять отдельные поля.

Тестирование DELETE-запросов

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'
  }
});

Особенности:

  • Можно тестировать CORS-заголовки.
  • Заголовки Content-Type и Accept автоматически учитываются при работе с JSON.

Асинхронные проверки и цепочки запросов

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');
      });
  });

Особенности:

  • Цепочки запросов обеспечивают проверку интеграции нескольких операций.
  • Можно комбинировать GET, POST, PUT, DELETE в одном тесте.

Проверка статус-кодов и обработки ошибок

Для тестирования ошибок полезно использовать 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' }
});

Итоговые рекомендации по работе с HTTP-методами

  • Всегда проверять статус ответа и ключевые поля в теле.
  • Использовать failOnStatusCode: false для тестирования ошибок.
  • Разделять тесты по типам запросов (GET, POST, PUT/PATCH, DELETE) для лучшей читаемости.
  • Использовать цепочки запросов для проверки последовательных действий.
  • Передавать заголовки и параметры через объекты headers и qs для гибкости.

Работа с HTTP-методами в Cypress обеспечивает надежное тестирование API и интеграцию с фронтендом, позволяя выявлять ошибки на ранних этапах разработки.