Теги и категоризация

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

Основы организации тестов

В Cypress тесты структурируются с помощью функций describe и it.

describe('Авторизация пользователя', () => {
  it('Успешный вход с корректными данными', () => {
    // тестовый сценарий
  });

  it('Попытка входа с неверным паролем', () => {
    // тестовый сценарий
  });
});

describe группирует тесты в блоки, а it описывает отдельные сценарии. Стандартная структура удобна, но при росте проекта появляется необходимость фильтрации тестов по признакам, например, «smoke», «regression», «critical».

Использование кастомных тегов

Cypress напрямую не поддерживает теги как в некоторых фреймворках (например, Cucumber), но их можно реализовать через атрибуты или кастомные комментарии, совместимые с плагинами типа cypress-grep.

Пример с cypress-grep:

describe('Авторизация пользователя', { tags: ['smoke', 'login'] }, () => {
  it('Успешный вход с корректными данными', { tags: ['critical'] }, () => {
    // тест
  });

  it('Попытка входа с неверным паролем', { tags: ['regression'] }, () => {
    // тест
  });
});

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

  • tags добавляются к блокам describe и it.
  • Плагин cypress-grep позволяет запускать тесты с фильтром по тегу:
npx cypress run --env grepTags=smoke

Это выполнит только тесты, помеченные тегом smoke.

Стратегии категоризации тестов

  1. По типу теста:

    • Smoke — критические проверки, которые проверяют основную функциональность.
    • Regression — тесты для проверки старой функциональности после изменений.
    • E2E — полные сценарии от начала до конца.
  2. По функциональным модулям: Разделение на группы по страницам или модулям приложения:

describe('Модуль корзины', { tags: ['cart'] }, () => {
  it('Добавление товара в корзину', { tags: ['smoke'] }, () => {});
  it('Удаление товара из корзины', { tags: ['regression'] }, () => {});
});
  1. По критичности: Тесты могут быть помечены как critical или minor. Это удобно для приоритизации при CI/CD, чтобы важные проверки выполнялись всегда, а второстепенные — по расписанию.

Динамическое управление тегами

Теги можно задавать динамически через переменные окружения или конфигурационные файлы.

const tags = Cypress.env('TAGS')?.split(',') || [];

describe('Модуль авторизации', () => {
  it('Вход с валидными данными', () => {
    if (!tags.includes('smoke')) {
      cy.log('Тест пропущен по тегу');
      return;
    }
    // тест
  });
});

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

Интеграция с CI/CD

Теги критически важны при работе с пайплайнами:

  • GitHub Actions: можно запускать только smoke тесты при pull request и все тесты при слиянии в main.
  • Jenkins или GitLab CI: теги позволяют создавать отдельные задачи для regression и smoke тестов, оптимизируя время прогона.

Пример конфигурации в GitHub Actions:

- name: Cypress run smoke tests
  run: npx cypress run --env grepTags=smoke

Советы по поддержке большого набора тегов

  • Создавать единый список тегов в конфигурации проекта (cypress.config.js или отдельный JSON).
  • Стараться использовать минимальный набор тегов, избегая дублирования.
  • Категоризировать тесты не только по функционалу, но и по стабильности: нестабильные тесты можно пометить flaky.

Тщательная организация тестов с использованием тегов повышает управляемость, сокращает время прогона и позволяет строить гибкие стратегии автоматизации, где каждый тест имеет чёткое предназначение и приоритет.