Конфигурация через плагины

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

Архитектура плагинов

Плагины Cypress запускаются в отдельном Node-процессе, называемом плагин-процессом (plugin process), который отличается от браузерного процесса, где выполняются тесты. Это разделение позволяет безопасно работать с файловой системой, выполнять HTTP-запросы и подключать сторонние модули без влияния на браузерный поток тестов.

Основной точкой входа для плагинов является файл cypress.config.js или cypress.config.ts, где можно определить секцию setupNodeEvents. В ней происходит регистрация всех необходимых событий и интеграций.

const { defineConfig } = require('cypress');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // регистрация плагинов и обработчиков событий
    },
  },
});

Здесь on используется для подписки на события Cypress, а config содержит текущую конфигурацию, которую можно изменять динамически.

События плагинов

С помощью функции on можно перехватывать и обрабатывать различные события:

  • before:run и after:run — выполняются до и после запуска всех тестов. Подходят для подготовки данных или очистки окружения.
  • task — позволяет создавать кастомные задачи, которые могут выполняться в Node.js и возвращать данные в тесты. Используется для работы с базой данных, файловой системой или внешними сервисами.
  • file:preprocessor — позволяет подключать собственные препроцессоры для файлов тестов или фикстур.
  • after:screenshot и before:screenshot — дают возможность модифицировать скриншоты перед их сохранением или после.

Пример создания кастомной задачи:

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        log(message) {
          console.log(message);
          return null;
        },
        generateRandomNumber(max) {
          return Math.floor(Math.random() * max);
        },
      });
    },
  },
});

В тестах эти задачи вызываются через команду cy.task():

cy.task('log', 'Тестовое сообщение');
cy.task('generateRandomNumber', 100).then((num) => {
  expect(num).to.be.lessThan(100);
});

Динамическая конфигурация

Плагины позволяют модифицировать конфигурацию Cypress во время выполнения, что полезно для создания различных сред тестирования. Например, можно подменять URL приложения, таймауты или переменные окружения в зависимости от переменной окружения Node.js:

setupNodeEvents(on, config) {
  if (process.env.TEST_ENV === 'staging') {
    config.baseUrl = 'https://staging.example.com';
  } else {
    config.baseUrl = 'https://prod.example.com';
  }
  return config;
}

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

Интеграция сторонних библиотек

Через плагины возможно подключение любых Node.js библиотек. Например, для отправки уведомлений в Slack при завершении тестов:

const axios = require('axios');

setupNodeEvents(on, config) {
  on('after:run', async (results) => {
    await axios.post(process.env.SLACK_WEBHOOK, {
      text: `Тесты завершены. Всего: ${results.totalTests}, Пройдено: ${results.totalPassed}`,
    });
  });
}

Это позволяет расширить стандартный функционал Cypress и интегрировать его в существующие CI/CD-процессы.

Работа с файлами и отчетами

Плагины используются для создания и модификации отчетов о тестировании, генерации логов или хранения временных данных. Событие task удобно применять для чтения и записи файлов, генерации динамических данных и передачи их обратно в тесты.

const fs = require('fs');

setupNodeEvents(on, config) {
  on('task', {
    readFile(path) {
      return fs.readFileSync(path, 'utf8');
    },
    writeFile({ path, content }) {
      fs.writeFileSync(path, content);
      return null;
    },
  });
}

Практические рекомендации

  • Плагины не должны содержать код, который выполняется в браузере; браузерный код нужно оставлять в тестах и кастомных командах.
  • Использовать task для тяжелых или асинхронных операций, чтобы не замедлять выполнение тестов.
  • Избегать изменения глобальных переменных Node.js в плагинах, чтобы не нарушать параллельное выполнение тестов.
  • Разделять плагины на отдельные модули при сложной логике для улучшения читаемости и поддержки.

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