Оптимизация времени выполнения

Эффективность автоматизированного тестирования напрямую зависит от скорости выполнения тестов. В проектах с большим количеством сценариев длительное выполнение может замедлять цикл разработки и увеличивать нагрузку на CI/CD. Cypress предоставляет множество инструментов и стратегий для оптимизации времени выполнения тестов без потери качества проверки.


Параллельное выполнение тестов

Cypress поддерживает параллельное выполнение тестов на нескольких машинах или контейнерах. Для этого используется Cypress Dashboard и параметр --parallel при запуске:

cypress run --record --parallel

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

  • Тесты автоматически распределяются между доступными агентами.
  • Для корректной работы необходимо, чтобы каждый тест был изолированным, без зависимости от состояния других тестов.
  • Рекомендуется использовать чистую среду для каждого параллельного запуска, чтобы избежать конфликтов данных.

Параллельный запуск особенно эффективен для проектов с сотнями тестов, сокращая общее время выполнения с часов до минут.


Разделение на группы и приоритеты

Разделение тестов по категориям позволяет запускать критичные проверки быстрее и откладывать менее важные. В Cypress используется механизм тегов через пакеты типа cypress-grep:

describe('Авторизация', { tags: ['smoke'] }, () => {
  it('успешный вход', () => {
    // тест
  })
})

Запуск только определённых тегов:

cypress run --env grepTags=smoke

Преимущества подхода:

  • Возможность запускать smoke-тесты при каждом коммите.
  • Уменьшение времени проверки изменений на ранней стадии.
  • Сегментация тестов по функциональным блокам и критичности.

Изоляция и повторное использование состояния

Каждый тест в Cypress по умолчанию изолирован и перезапускает браузер перед beforeEach. Это безопасно, но затратно по времени. Оптимизация возможна через:

  1. Использование before вместо beforeEach для операций, которые нужно выполнить один раз за набор тестов:
before(() => {
  cy.login('admin', 'password') // один раз
})
  1. Сохранение сессий и куки между тестами:
Cypress.Cookies.defaults({
  preserve: ['session_id', 'auth_token']
})

Эти методы позволяют избежать повторного выполнения длительных действий, таких как логин или загрузка данных.


Минимизация DOM-операций

Каждое обращение к DOM и сетевые запросы увеличивают время теста. Для ускорения работы:

  • Использовать точные селекторы, чтобы Cypress не искал элементы по всему дереву.
  • Избегать cy.wait() с фиксированным временем, заменяя его ждущими условиями:
cy.get('.loader', { timeout: 10000 }).should('not.exist')
  • Применять стабильные состояния: мокирование сетевых запросов через cy.intercept() уменьшает зависимость от реального сервера и ускоряет тест.
cy.intercept('GET', '/api/data', { fixture: 'data.json' })

Оптимизация сетевых запросов

Мокирование запросов критично для ускорения тестов, особенно при больших объёмах данных. Cypress позволяет:

  • Подменять API-ответы локальными фикстурами (fixtures).
  • Использовать alias и wait для синхронизации без излишних задержек:
cy.intercept('GET', '/users').as('getUsers')
cy.visit('/dashboard')
cy.wait('@getUsers')
  • Применять stub вместо real backend для сценариев, где нет необходимости тестировать сервер.

Параметры запуска и конфигурация

Cypress позволяет тонко настраивать запуск для ускорения:

  • --headed vs --headless: запуск в headless-режиме часто быстрее.
  • --browser chrome или electron: Electron может быть быстрее на CI.
  • Установка numTestsKeptInMemory снижает потребление памяти и ускоряет большие сьюты.

Пример конфигурации cypress.config.js для ускорения:

export default {
  video: false,
  screenshotOnRunFailure: false,
  numTestsKeptInMemory: 5,
  defaultCommandTimeout: 5000,
  pageLoadTimeout: 20000
}

Избегание лишней визуализации

В UI-тестах рендер страницы и анимации могут замедлять выполнение. Для ускорения:

  • Отключать анимации через CSS в тестовой среде:
* {
  transition: none !important;
  animation: none !important;
}
  • Минимизировать скриншоты и видео для локального запуска, оставляя их для CI только при падении теста.

Рекомендации по структуре тестов

  • Малые, независимые тесты выполняются быстрее, чем длинные цепочки проверок.
  • Группировка по функционалу позволяет параллелить их и повторно использовать состояния.
  • Мокирование и фикстуры сокращает зависимость от внешних ресурсов.

Эти принципы обеспечивают масштабируемость и предсказуемость времени выполнения при увеличении числа тестов.


Эффективная оптимизация Cypress-тестов требует сочетания параллельного выполнения, правильной структуры тестов, сохранения состояния и минимизации сетевых и DOM-операций. Такой подход позволяет сокращать время тестирования в несколько раз без потери стабильности и качества проверки.