Система плагинов Cypress

Cypress предоставляет гибкую и расширяемую систему плагинов, которая позволяет модифицировать стандартное поведение фреймворка, добавлять кастомные команды, интегрироваться с внешними инструментами и автоматизировать процессы тестирования. Плагины в Cypress создаются с использованием Node.js и подключаются через файл конфигурации cypress.config.js или через отдельный файл плагинов cypress/plugins/index.js (в старых версиях Cypress до 10).


Подключение и структура плагинов

Плагин представляет собой JavaScript-файл, экспортирующий функцию, которая принимает два аргумента: on и config.

  • on — объект, позволяющий подписываться на события Cypress (например, before:browser:launch, task, file:preprocessor).
  • config — объект конфигурации Cypress, который можно модифицировать для изменения поведения тестов.

Пример минимальной структуры плагина:

module.exports = (on, config) => {
  // Подписка на событие запуска браузера
  on('before:browser:launch', (browser = {}, launchOptions) => {
    if (browser.name === 'chrome') {
      launchOptions.args.push('--disable-gpu');
    }
    return launchOptions;
  });

  // Добавление кастомной задачи
  on('task', {
    log(message) {
      console.log(message);
      return null;
    }
  });

  // Изменение конфигурации
  config.baseUrl = 'https://example.com';
  return config;
};

Основные возможности системы плагинов

  1. Обработка задач Node.js через task Событие task позволяет выполнять код на стороне Node.js, что особенно важно для операций с файловой системой, базой данных или внешними API.

    Пример:

on('task', {
  readFile(filename) {
    const fs = require('fs');
    return fs.readFileSync(filename, 'utf8');
  }
});
  1. Модификация поведения браузера Событие before:browser:launch позволяет добавлять аргументы запуска, менять профиль браузера, включать/отключать плагины.
on('before:browser:launch', (browser = {}, launchOptions) => {
  if (browser.name === 'firefox') {
    launchOptions.preferences['browser.startup.homepage'] = 'https://example.com';
  }
  return launchOptions;
});
  1. Подключение препроцессоров файлов Cypress поддерживает препроцессоры для TypeScript, CoffeeScript и других форматов. Событие file:preprocessor используется для подключения собственного препроцессора:
const webpack = require('@cypress/webpack-preprocessor');

on('file:preprocessor', webpack({
  webpackOptions: require('../. ./webpack.config.js')
}));
  1. Интеграция с внешними сервисами Через плагины реализуются интеграции с системами отчетности, CI/CD, базами данных, инструментами для визуального тестирования и другими внешними сервисами. Например, можно отправлять результаты тестов в Jira или Slack.

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

if (process.env.NODE_ENV === 'staging') {
  config.baseUrl = 'https://staging.example.com';
}
return config;

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

Для поддержания читаемости и масштабируемости проекта часто создают отдельную папку cypress/plugins/tasks и разбивают код на несколько модулей:

cypress/
└─ plugins/
   ├─ index.js       // основной файл подключения
   └─ tasks/
      ├─ db.js
      ├─ files.js
      └─ reports.js

В index.js они объединяются:

const dbTasks = require('./tasks/db');
const fileTasks = require('./tasks/files');

module.exports = (on, config) => {
  on('task', {
    ...dbTasks,
    ...fileTasks
  });
  return config;
};

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


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

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

Рекомендации по использованию

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

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