В Cypress существует два основных механизма повторных попыток при тестировании: Test Retries и Command Retries. Понимание их различий и областей применения критически важно для стабильности тестов и эффективного управления асинхронным поведением веб-приложений.
Command Retries — это встроенный механизм Cypress, который автоматически повторяет отдельные команды до тех пор, пока не будет выполнено условие успешного результата или не истечёт таймаут.
Принципы работы:
cy.get(),
cy.contains()) обладают автоматической повторной
попыткой.{ timeout: ms }.Пример использования:
cy.get('#submit-button', { timeout: 10000 }).should('be.visible').click();
В этом примере cy.get будет пытаться найти элемент
#submit-button в течение 10 секунд. Если кнопка появится
через 5 секунд, тест продолжится сразу, без ошибки.
Ключевые особенности Command Retries:
Test Retries — это механизм повторного запуска всего теста при его падении.
Принципы работы:
cypress.config.js) или в рамках конкретного теста через
retries().Пример настройки в конфиге:
// 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:
| Параметр | Command Retries | Test Retries |
|---|---|---|
| Объект повторения | Одна команда | Весь тест |
| Настройка | Опция timeout команды |
Конфигурация retries |
| Причина срабатывания | Команда не выполнилась успешно | Тест завершился ошибкой |
| Продолжительность | Пока условие не выполнено или таймаут | Зависит от количества попыток, настроенных в конфиге |
| Подходит для | Асинхронного DOM, динамических элементов | Случайных сбоев, нестабильной среды |
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 для обеспечения устойчивости тестов и управления асинхронностью веб-приложений. Их понимание и грамотное использование позволяет минимизировать ложные падения и одновременно выявлять настоящие ошибки приложения.