Параллелизация без Dashboard

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

Основные принципы параллельного запуска

  1. Разделение тестов на блоки Cypress выполняет тесты в рамках отдельных spec файлов. Для эффективной параллелизации каждый spec должен быть независимым и изолированным, чтобы результат одного файла не влиял на другой.

  2. Использование параметра --spec При запуске Cypress через CLI можно указывать конкретный spec файл:

    npx cypress run --spec "cypress/e2e/login.cy.js"

    Это позволяет запускать несколько spec файлов параллельно, распределяя их на разные процессы или машины.

  3. Организация файловой структуры Рекомендуется делить тесты так, чтобы каждый файл содержал логически завершённый набор проверок. Например:

    cypress/e2e/
    ├─ login.cy.js
    ├─ dashboard.cy.js
    ├─ settings.cy.js
    └─ checkout.cy.js

    Такой подход упрощает распределение нагрузки между потоками.

Параллелизация через npm-скрипты

Можно создать несколько скриптов для параллельного запуска spec файлов:

{
  "scripts": {
    "test:login": "cypress run --spec 'cypress/e2e/login.cy.js'",
    "test:dashboard": "cypress run --spec 'cypress/e2e/dashboard.cy.js'",
    "test:all-parallel": "npm-run-all --parallel test:*"
  }
}

Здесь используется пакет npm-run-all, который позволяет запускать несколько npm-скриптов одновременно. Каждый процесс запускает отдельный spec, что обеспечивает параллельное выполнение.

Параллельное выполнение через CI/CD

Для больших проектов параллелизация обычно выполняется через CI/CD. Основные подходы:

  1. Matrix-стратегия в GitHub Actions

    jobs:
      cypress-tests:
        runs-on: ubuntu-latest
        strategy:
          matrix:
            spec: [login.cy.js, dashboard.cy.js, settings.cy.js]
        steps:
          - uses: actions/checkout@v3
          - uses: cypress-io/github-action@v5
            with:
              spec: cypress/e2e/${{ matrix.spec }}

    Каждый spec запускается в отдельном рабочем процессе, обеспечивая реальную параллельность.

  2. Использование Docker-контейнеров Cypress отлично работает в Docker. Несколько контейнеров можно поднять параллельно, каждый с собственным набором spec файлов. Это особенно эффективно при большом числе тестов, когда один поток может занимать несколько минут.

    Пример команды:

    docker run -it -v $PWD:/e2e -w /e2e cypress/included:12.14.0 npx cypress run --spec "cypress/e2e/login.cy.js"

Учет данных и состояния

При параллельном запуске критически важно, чтобы тесты не пересекались по состоянию приложения и данным. Основные методы изоляции:

  • Очистка состояния между тестами Использование beforeEach для сброса данных, очистки базы или сброса локального хранилища.

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

  • Разделение окружений Для CI-параллелизации полезно иметь несколько экземпляров базы данных или тестового окружения.

Синхронизация и контроль результатов

Без Dashboard контроль выполнения и сбор результатов требует ручной настройки:

  • Сохранение результатов в JSON или JUnit Cypress позволяет экспортировать отчёты в формате JUnit:

    npx cypress run --reporter junit --reporter-options "mochaFile=results/test-[hash].xml"

    После чего CI/CD собирает все отчёты в единый файл.

  • Скрипты агрегации результатов При большом числе параллельных потоков полезно использовать Node.js скрипты, которые объединяют JSON или XML отчёты в единый отчёт, удобный для анализа.

Преимущества подхода без Dashboard

  • Полный контроль над инфраструктурой и процессами тестирования.
  • Отсутствие зависимости от внешнего сервиса, что снижает задержки и возможные ограничения по количеству тестов.
  • Гибкость при интеграции с существующими CI/CD пайплайнами и кастомными отчетами.

Ограничения и особенности

  • Нет автоматического расчёта распределения тестов по времени выполнения, как в Dashboard. Нужно вручную планировать нагрузку между потоками.
  • Требуется следить за конфликтами данных между потоками, особенно при работе с одной базой данных.
  • Логирование и сбор скриншотов требует дополнительной настройки, чтобы не потерять важную информацию.

Параллельное выполнение тестов в Cypress без Dashboard требует тщательного планирования структуры тестов, изоляции данных и настройки процессов CI/CD, но при правильной реализации позволяет добиться высокой скорости и стабильности тестирования.