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 для тяжелых или асинхронных операций,
чтобы не замедлять выполнение тестов.Плагины обеспечивают гибкую настройку Cypress, делая возможным интеграцию с внешними инструментами, кастомизацию процессов тестирования и создание сложной инфраструктуры автоматизации. Они позволяют адаптировать Cypress под любые задачи и окружения, обеспечивая высокую производительность и масштабируемость тестов.