Custom reporters для расширенной аналитики

Playwright предоставляет встроенные средства для отчётности о результатах тестов, включая форматы list, json, html и junit. Однако для сложных проектов стандартных отчётов часто недостаточно. В таких случаях на помощь приходят custom reporters — пользовательские репортеры, позволяющие собирать, фильтровать и визуализировать данные тестирования по собственным правилам.


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

Custom reporter в Playwright реализуется как класс, который наследует функциональность Reporter. Основные методы, которые можно переопределить для расширенной аналитики:

  • onBegin(config, suite) — вызывается перед стартом всех тестов. Здесь можно инициализировать логирование, создавать файлы отчётов или подключать сторонние сервисы аналитики.
  • onTestBegin(test) — срабатывает при начале выполнения отдельного теста. Используется для отметки времени начала, запуска таймеров или логирования дополнительной информации.
  • onTestEnd(test, result) — основной метод для сбора результатов теста. Содержит объект result, включающий статус (passed, failed, skipped), время выполнения, ошибки и трассировки.
  • onEnd(result) — вызывается после завершения всех тестов. Подходит для агрегации данных, генерации итоговых отчётов и интеграции с внешними системами мониторинга.

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


Создание собственного репортера

Простейший пример репортера, который собирает статистику по тестам и сохраняет её в JSON:

const fs = require('fs');

class JsonAnalyticsReporter {
  constructor() {
    this.results = [];
  }

  onTestEnd(test, result) {
    this.results.push({
      title: test.title,
      status: result.status,
      duration: result.duration,
      error: result.error ? result.error.message : null
    });
  }

  onEnd() {
    fs.writeFileSync('analytics.json', JSON.stringify(this.results, null, 2));
  }
}

module.exports = JsonAnalyticsReporter;

Здесь каждый тест фиксируется с ключевыми параметрами, а после завершения всех тестов создаётся структурированный JSON для дальнейшей аналитики.


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

Custom reporters позволяют отправлять данные не только в файлы, но и в API или базы данных. Например, для отправки статистики в сервис мониторинга:

const axios = require('axios');

class RemoteAnalyticsReporter {
  constructor() {
    this.results = [];
  }

  onTestEnd(test, result) {
    this.results.push({
      testName: test.title,
      status: result.status,
      duration: result.duration
    });
  }

  async onEnd() {
    await axios.post('https://analytics.example.com/test-results', this.results);
  }
}

module.exports = RemoteAnalyticsReporter;

Таким образом можно автоматически собирать метрики, строить графики производительности и отслеживать стабильность тестов в динамике.


Совмещение с Playwright hooks

Custom reporter хорошо сочетается с hooks Playwright (beforeAll, afterAll, beforeEach, afterEach). Это позволяет расширять отчётность:

  • Логировать состояние окружения до и после теста.
  • Собирать скриншоты и видео при падении тестов и добавлять их в отчёт.
  • Отслеживать задержки и время загрузки страниц.

Например, можно автоматически добавлять скриншоты падений:

onTestEnd(test, result) {
  const entry = {
    title: test.title,
    status: result.status
  };

  if (result.status === 'failed' && result.attachments) {
    entry.screenshots = result.attachments
      .filter(a => a.name === 'screenshot')
      .map(a => a.path);
  }

  this.results.push(entry);
}

Динамическая фильтрация и аналитика

Custom reporters дают возможность фильтровать и агрегировать данные перед выводом:

  • Подсчёт количества успешных и упавших тестов по тегам или категориям.
  • Выделение медленных тестов для оптимизации тестовой базы.
  • Формирование сводной статистики по коммитам или сборкам для CI/CD.

Пример агрегации по статусу:

onEnd() {
  const summary = this.results.reduce((acc, r) => {
    acc[r.status] = (acc[r.status] || 0) + 1;
    return acc;
  }, {});

  console.log('Test summary:', summary);
}

Использование в конфигурации Playwright

Для подключения собственного репортера необходимо указать его в файле playwright.config.js:

const JsonAnalyticsReporter = require('./reporters/jsonAnalyticsReporter');

module.exports = {
  reporter: [
    ['list'],
    [JsonAnalyticsReporter]
  ],
};

Можно комбинировать несколько репортеров одновременно: стандартные и кастомные, что позволяет одновременно получать визуальные отчёты и собирать структурированные данные для аналитики.


Ключевые преимущества custom reporters

  • Гибкость: возможность собирать любые данные, включая внутренние метрики тестов.
  • Интеграция: прямое подключение к внешним системам аналитики и CI/CD.
  • Автоматизация: формирование отчётов, фильтров и сводных таблиц без дополнительной обработки.
  • Производительность: мониторинг медленных или нестабильных тестов, выявление узких мест в тестовой базе.

Custom reporters превращают Playwright из инструмента для функционального тестирования в полноценную платформу для расширенной аналитики и мониторинга качества кода.