Симуляция сетевых ошибок

Сетевые ошибки в веб-приложениях могут возникать по различным причинам: медленное соединение, потеря пакетов, сбои на сервере или ошибки API. Для полноценного тестирования необходимо уметь имитировать такие условия, чтобы проверить устойчивость приложения к нестабильной сети. Cypress предоставляет инструменты для перехвата и модификации сетевых запросов, позволяя создавать реалистичные сценарии отказов.

Перехват сетевых запросов

Основной инструмент — команда cy.intercept(). Она позволяет перехватывать HTTP-запросы, изменять их ответ или симулировать ошибки. Синтаксис базовый:

cy.intercept(method, url, routeHandler)
  • method — HTTP-метод (GET, POST и т.д.).
  • url — URL запроса или регулярное выражение для его сопоставления.
  • routeHandler — объект, функция или фиктивный ответ, который заменяет реальный.

Симуляция сетевых ошибок

Cypress позволяет искусственно создавать ошибки сети, используя опцию forceNetworkError.

cy.intercept('GET', '/api/data', {
  forceNetworkError: true
}).as('getData');

При таком подходе запрос не будет доходить до сервера, и приложение получит ошибку соединения. Это позволяет проверять корректное отображение уведомлений, повторные попытки или fallback-механизмы.

Другой способ — возврат ответа с ошибочным статусом, имитирующего сбой на сервере:

cy.intercept('POST', '/api/submit', {
  statusCode: 500,
  body: { error: 'Internal Server Error' },
}).as('submitForm');

Важно различать два сценария:

  • Сетевые ошибки (forceNetworkError) — запрос не отправляется, имитируется полное отсутствие сети.
  • Ошибки сервера (statusCode >= 400) — сервер отвечает, но с кодом ошибки.

Задержки и имитация медленного соединения

Для тестирования поведения приложения при медленном интернете используется опция delay. Она позволяет искусственно замедлять ответ сервера:

cy.intercept('GET', '/api/data', {
  delayMs: 2000,
  statusCode: 200,
  body: { data: [1, 2, 3] }
}).as('getDataSlow');

Проверка интерфейса при задержках важна для отображения спиннеров, тайм-аутов и прогресс-баров.

Использование alias для ожидания запросов

Присвоение перехваченным запросам alias через .as() позволяет ожидать их завершения и выполнять дополнительные проверки:

cy.wait('@getDataSlow').its('response.statusCode').should('eq', 200);

Alias можно использовать для анализа:

  • request.body — тело исходного запроса;
  • response.body — тело ответа;
  • response.statusCode — код ответа.

Это позволяет проверять, как фронтенд реагирует на конкретные данные или ошибки.

Комбинация различных сценариев

Cypress позволяет комбинировать ошибки сети, задержки и статус-коды, создавая сложные сценарии отказоустойчивости:

cy.intercept('GET', '/api/data', (req) => {
  if (Math.random() < 0.3) {
    req.reply({ forceNetworkError: true });
  } else {
    req.reply({ delayMs: 1500, statusCode: 200, body: { data: [] } });
  }
}).as('unstableData');

Такой подход имитирует непредсказуемое поведение сети, что полезно для тестирования приложений с высоким уровнем отказоустойчивости.

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

  • Использовать отдельный блок beforeEach для настройки перехватов, чтобы тесты оставались изолированными.
  • Проверять обработку сбоя загрузки данных через визуальные индикаторы (спиннер, сообщение об ошибке).
  • Для нагрузочного тестирования использовать комбинацию задержек и ошибок сервера.
  • При тестировании форм и операций с критическими данными комбинировать сетевые ошибки с проверкой сохранения состояния.

Интеграция с Cypress Studio и CI

Симуляция сетевых ошибок работает одинаково локально и в CI/CD-пайплайнах. Важно учитывать:

  • Стабильность тестов: всегда проверять alias и корректность асинхронных операций.
  • Логирование: использовать cy.log() или встроенные события Cypress для отслеживания сбоев в отчетах.
  • Повторяемость: избегать случайной генерации ошибок без фиксации seed, чтобы тесты были детерминированы.

С помощью этих инструментов можно полноценно моделировать любые нештатные сетевые условия, что повышает надежность тестируемого приложения и качество автоматизации.