Test retries vs command retries

В Cypress существует два основных механизма повторных попыток при тестировании: Test Retries и Command Retries. Понимание их различий и областей применения критически важно для стабильности тестов и эффективного управления асинхронным поведением веб-приложений.


Command Retries

Command Retries — это встроенный механизм Cypress, который автоматически повторяет отдельные команды до тех пор, пока не будет выполнено условие успешного результата или не истечёт таймаут.

Принципы работы:

  • Команды Cypress (например, cy.get(), cy.contains()) обладают автоматической повторной попыткой.
  • Повтор происходит только в пределах одной команды, пока не выполнится условие (например, элемент станет видимым, текст появится).
  • Таймаут по умолчанию для команды составляет 4 секунды, но его можно изменять через опцию { timeout: ms }.

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

cy.get('#submit-button', { timeout: 10000 }).should('be.visible').click();

В этом примере cy.get будет пытаться найти элемент #submit-button в течение 10 секунд. Если кнопка появится через 5 секунд, тест продолжится сразу, без ошибки.

Ключевые особенности Command Retries:

  • Повторяются только команды, а не весь тест.
  • Упрощают работу с динамическим контентом и асинхронной загрузкой данных.
  • Не помогают при ошибках, которые возникают вне команд Cypress, например, при прямом обращении к JavaScript-коду.

Test Retries

Test Retries — это механизм повторного запуска всего теста при его падении.

Принципы работы:

  • Повтор запускается, если тест завершился с ошибкой, включая ошибки Cypress и необработанные исключения.
  • Настройка осуществляется на уровне конфигурации Cypress (cypress.config.js) или в рамках конкретного теста через retries().
  • Можно задавать количество повторов для локальной среды и CI отдельно.

Пример настройки в конфиге:

// cypress.config.js
module.exports = {
  e2e: {
    retries: {
      runMode: 2, // повтор в CI
      openMode: 1 // повтор при локальном запуске
    }
  }
}

Пример задания для отдельного теста:

it('Проверка формы', { retries: 3 }, () => {
  cy.get('#name').type('Тест');
  cy.get('#submit').click();
  cy.contains('Успешно отправлено');
});

Ключевые особенности Test Retries:

  • Повторяется весь тест, а не отдельная команда.
  • Позволяет «подстраховать» нестабильные тесты в CI.
  • Эффективен при редких ошибках, возникающих из-за временных сбоев или сетевых задержек.
  • Может скрывать реальные баги, если используется чрезмерно — поэтому важно анализировать, почему тест падает, прежде чем полагаться на повторы.

Отличия Command Retries от Test Retries

Параметр Command Retries Test Retries
Объект повторения Одна команда Весь тест
Настройка Опция timeout команды Конфигурация retries
Причина срабатывания Команда не выполнилась успешно Тест завершился ошибкой
Продолжительность Пока условие не выполнено или таймаут Зависит от количества попыток, настроенных в конфиге
Подходит для Асинхронного DOM, динамических элементов Случайных сбоев, нестабильной среды

Рекомендации по использованию

  • Command Retries используются по умолчанию и не требуют ручной настройки. Их цель — сделать тесты устойчивыми к временной недоступности элементов.
  • Test Retries стоит включать для тестов, которые падают в CI из-за непредсказуемых факторов: сетевых задержек, нестабильных API, временных ошибок.
  • Не рекомендуется массово полагаться на Test Retries вместо исправления реальных проблем — повторные попытки теста не исправляют баги приложения.
  • Совмещение обоих механизмов позволяет добиться стабильности тестов: команды автоматически повторяются, а весь тест при редких сбоях может запускаться повторно.

Примеры сочетания

it('Сложный сценарий с загрузкой данных', { retries: 2 }, () => {
  cy.visit('/dashboard');
  cy.get('.data-row', { timeout: 15000 }).should('have.length.greaterThan', 0);
  cy.get('#refresh-button').click();
  cy.get('.notification').should('contain.text', 'Обновлено');
});

Здесь cy.get('.data-row') использует command retries с таймаутом 15 секунд, а весь тест может повториться 2 раза при случайных падениях, обеспечивая надежность даже в нестабильной среде.


Механизмы Command Retries и Test Retries являются фундаментальными инструментами Cypress для обеспечения устойчивости тестов и управления асинхронностью веб-приложений. Их понимание и грамотное использование позволяет минимизировать ложные падения и одновременно выявлять настоящие ошибки приложения.