Cypress предоставляет встроенные механизмы для логирования и генерации отчетов о выполнении тестов. Однако стандартные решения могут быть недостаточны при необходимости интеграции с внешними системами, создании нестандартного форматирования отчетов или при специфических требованиях к визуализации результатов тестирования. В таких случаях применяются кастомные reporters.
Reporter — это модуль, который получает события от Cypress во время выполнения тестов и формирует отчет в нужном формате. Reporter работает на уровне Node.js, обрабатывая события тестового раннера, такие как:
test:before:run — тест готовится к запуску.test:after:run — тест завершен, доступна информация о
его статусе, длительности и ошибках.runner:start и runner:end — старт и
завершение всей сессии.suite:start и suite:end — начало и конец
группы тестов.Эти события позволяют собрать полную информацию о тестах и формировать кастомный вывод, например JSON, XML, HTML или интеграцию с внешними системами отчетности.
Кастомный reporter — это обычный Node.js модуль, который экспортирует функцию-конструктор. Простейшая структура выглядит так:
const mocha = require('mocha');
const Base = mocha.reporters.Base;
class CustomReporter extends Base {
constructor(runner) {
super(runner);
runner.on('start', () => {
console.log('Начало выполнения тестов');
});
runner.on('pass', (test) => {
console.log(`Пройден тест: ${test.fullTitle()}`);
});
runner.on('fail', (test, err) => {
console.log(`Провален тест: ${test.fullTitle()}`);
console.log(`Ошибка: ${err.message}`);
});
runner.on('end', () => {
console.log('Все тесты завершены');
});
}
}
module.exports = CustomReporter;
Ключевые моменты:
mocha.reporters.Base предоставляет
полезные утилиты: форматирование времени, цветовое выделение статуса
тестов.runner.on(...) позволяют отслеживать состояние
каждого теста и каждой группы тестов.Чтобы применить кастомный reporter, его необходимо зарегистрировать в
конфигурации Cypress. В cypress.config.js или
cypress.json указывается:
const customReporter = require('./reporters/custom-reporter');
module.exports = {
reporter: customReporter,
};
Можно также использовать стандартное поле
reporterOptions, чтобы передавать параметры в кастомный
reporter:
module.exports = {
reporter: './reporters/custom-reporter',
reporterOptions: {
outputFile: 'reports/output.json',
includeStack: true,
},
};
Внутри конструктора reporter параметры доступны через
runner или через объект опций:
class CustomReporter extends Base {
constructor(runner, options) {
super(runner);
this.outputFile = options.reporterOptions.outputFile || 'report.json';
}
}
Для сохранения результатов в файл можно использовать стандартный
модуль fs:
const fs = require('fs');
const path = require('path');
runner.on('end', () => {
const results = this.tests.map(test => ({
title: test.title,
fullTitle: test.fullTitle(),
state: test.state,
duration: test.duration,
err: test.err ? test.err.message : null
}));
const outputPath = path.resolve(this.outputFile);
fs.writeFileSync(outputPath, JSON.stringify(results, null, 2));
});
Особенности:
Кастомные reporters позволяют автоматически отправлять результаты тестов в внешние системы:
Пример отправки отчета на HTTP-сервер:
const axios = require('axios');
runner.on('end', async () => {
const results = this.tests.map(test => ({
title: test.title,
state: test.state,
}));
await axios.post('https://example.com/api/tests', results);
});
Кастомные reporters открывают возможности для полной адаптации процесса отчетности под конкретные задачи тестирования и интеграции с инфраструктурой разработки, делая Cypress инструментом не только для проверки функциональности, но и для построения надежной системы контроля качества.