Retries в Cypress — это механизм повторного выполнения тестов или отдельных команд при их временных сбоях. Он особенно полезен для нестабильных тестов, которые зависят от асинхронных операций, внешних API или динамического поведения веб-страниц. Правильная настройка retries позволяет повысить надёжность тестового набора без лишнего увеличения времени выполнения.
В Cypress retries настраиваются на двух уровнях: глобально для всех
тестов и локально для конкретного теста или блока
describe.
Глобальная настройка: Для включения глобальных
повторов используется файл конфигурации cypress.config.js
(Cypress v10+).
const { defineConfig } = require('cypress')
module.exports = defineConfig({
e2e: {
retries: {
runMode: 2, // количество повторов при запуске через cypress run
openMode: 1 // количество повторов при запуске через cypress open
},
baseUrl: 'http://localhost:3000'
}
})
Объяснение параметров:
runMode — количество повторов при запуске тестов через
CLI (cypress run).openMode — количество повторов при интерактивном
запуске (cypress open).Если retries настроены глобально, все тесты автоматически используют указанные значения.
Для более точного контроля retries можно указать их на уровне конкретного теста или группы тестов:
describe('Тестирование формы авторизации', { retries: { runMode: 3, openMode: 1 } }, () => {
it('должен корректно авторизоваться', { retries: 2 }, () => {
cy.visit('/login')
cy.get('input[name="username"]').type('admin')
cy.get('input[name="password"]').type('password123')
cy.get('button[type="submit"]').click()
cy.url().should('include', '/dashboard')
})
})
Особенности локальной настройки:
it, переопределяет
глобальные retries только для этого теста.describe, применяется ко всем
тестам внутри блока, если отдельные тесты не имеют своих overrides.При включённых retries Cypress повторяет только неудачные тесты.
В логе Cypress видно количество попыток для каждого теста:
1) Тестирование формы авторизации › должен корректно авторизоваться (failed)
Retrying: 1 of 2
Использовать для нестабильных тестов Не следует включать retries для всех тестов без разбора. Если тест падает из-за логической ошибки, retries просто скрывают проблему.
Комбинировать с cy.wait() осторожно
Вместо добавления искусственных задержек лучше использовать команды
Cypress с ожиданием элементов
(cy.get(...).should('be.visible')).
Отслеживать повторные попытки в CI/CD В отчётах Cypress каждая попытка теста отражается. Это помогает определить, какие тесты нестабильны и требуют исправления.
Использовать только для E2E и интеграционных тестов Для unit-тестов retries редко нужны, так как они обычно стабильны и быстры.
Повтор попытки при временном сбое API:
it('получает данные с внешнего API', { retries: 3 }, () => {
cy.request('/api/data')
.its('status')
.should('eq', 200)
})
Если запрос к API не прошёл с первого раза из-за временной ошибки, Cypress автоматически повторит тест до трёх раз.
Использование с асинхронным контентом:
it('должен отобразить динамическую таблицу', { retries: 2 }, () => {
cy.visit('/dashboard')
cy.get('table#users').should('exist')
cy.get('table#users tr').should('have.length.greaterThan', 0)
})
В этом случае retries помогают корректно отлавливать моменты, когда таблица ещё не успела загрузиться.
before или
beforeEach. Они повторяют только сам тест
(it).before/beforeEach, тест считается проваленным,
и retries не выполняются.afterEach выполняются после каждой попытки
теста, что позволяет очищать состояние между попытками.Настройка retries — ключевой инструмент повышения стабильности E2E тестов в Cypress. Гибкое управление уровнями повторов и разумное применение позволяют уменьшить ложные падения и ускорить отладку нестабильных сценариев.