Кастомные reporters

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


Принципы работы reporters

Reporter — это модуль, который получает события от Cypress во время выполнения тестов и формирует отчет в нужном формате. Reporter работает на уровне Node.js, обрабатывая события тестового раннера, такие как:

  • test:before:run — тест готовится к запуску.
  • test:after:run — тест завершен, доступна информация о его статусе, длительности и ошибках.
  • runner:start и runner:end — старт и завершение всей сессии.
  • suite:start и suite:end — начало и конец группы тестов.

Эти события позволяют собрать полную информацию о тестах и формировать кастомный вывод, например JSON, XML, HTML или интеграцию с внешними системами отчетности.


Структура кастомного reporter

Кастомный 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 для использования кастомного reporter

Чтобы применить кастомный 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));
});

Особенности:

  • JSON-формат удобен для интеграции с CI/CD системами.
  • Можно создавать HTML-шаблоны, используя шаблонизаторы типа Handlebars или EJS, чтобы визуализировать результаты.
  • Важно корректно обрабатывать ошибки и продолжительность тестов для точной статистики.

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

Кастомные reporters позволяют автоматически отправлять результаты тестов в внешние системы:

  • Сервисы мониторинга тестов (TestRail, Jira, Allure).
  • Slack или электронную почту для уведомлений о проваленных тестах.
  • Dashboards с графиками успешности тестов.

Пример отправки отчета на 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);
});

Советы по созданию кастомного reporter

  1. Минимализм на старте: лучше сначала собрать базовый отчет, а потом добавлять сложные фичи.
  2. Использование наследования от Base: это позволяет использовать встроенные функции форматирования и цвета.
  3. Асинхронные операции: следует аккуратно работать с асинхронным кодом, чтобы не блокировать runner.
  4. Логирование: детальные логи при разработке помогут отлаживать структуру отчета.
  5. Проверка совместимости: убедиться, что reporter корректно работает с различными версиями Cypress и Mocha.

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