Custom reporters

Jasmine предоставляет встроенные средства для вывода результатов тестирования, включая стандартный репортер, который выводит результаты в консоль. Однако часто требуется более сложный контроль над выводом или интеграция с внешними системами для логирования, отчетности или других целей. Для таких случаев Jasmine позволяет создавать собственные репортеры.

Что такое репортеры?

Репортеры в Jasmine — это механизмы, которые обрабатывают результаты тестов и отображают их пользователю в том или ином формате. По умолчанию Jasmine использует консольный репортер, который выводит результаты в виде текста в стандартный вывод (консоль). Однако в большинстве случаев необходимо кастомизировать вывод для более удобной или специфической отчетности.

Структура кастомного репортера

Репортеры в Jasmine должны быть реализованы как объект, который реализует один или несколько методов, связанных с жизненным циклом тестов. В частности, для создания кастомного репортера нужно реализовать следующие методы:

  • jasmine.getEnv() — позволяет получить окружение Jasmine.
  • initialize() — инициализация репортера.
  • specStarted() — вызывается, когда начинается выполнение теста.
  • specDone() — вызывается, когда тест завершен.
  • suiteStarted() — вызывается перед запуском набора тестов (свита).
  • suiteDone() — вызывается после завершения набора тестов.
  • Jasmine done() — вызывается после завершения всего тестового процесса.

Кастомный репортер можно зарегистрировать в Jasmine через метод jasmine.getEnv().addReporter(), который добавляет новый репортер в тестовую среду.

Пример простого кастомного репортера

Пример простого репортера, который выводит название каждого теста и его результат:

class CustomReporter {
  specStarted(result) {
    console.log('Тест начат: ' + result.fullName);
  }

  specDone(result) {
    if (result.status === 'passed') {
      console.log(`Тест ${result.fullName} прошел`);
    } else if (result.status === 'failed') {
      console.log(`Тест ${result.fullName} не прошел`);
      console.log('Причина: ' + result.failedExpectations[0].message);
    }
  }

  jasmineDone() {
    console.log('Тестирование завершено.');
  }
}

jasmine.getEnv().addReporter(new CustomReporter());

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

Расширение функциональности репортера

В реальных проектах часто нужно добавлять дополнительные возможности в кастомные репортеры, такие как логирование в файл, отправка результатов на сервер или интеграция с внешними системами (например, Jira или Slack). Пример, где репортер отправляет информацию о статусе тестов в файл:

const fs = require('fs');

class FileLoggingReporter {
  constructor() {
    this.logFile = 'test_results.log';
  }

  specDone(result) {
    const logMessage = `Тест: ${result.fullName} | Статус: ${result.status}\n`;
    fs.appendFileSync(this.logFile, logMessage);
  }

  jasmineDone() {
    console.log('Результаты тестов записаны в файл.');
  }
}

jasmine.getEnv().addReporter(new FileLoggingReporter());

Этот репортер записывает результаты каждого теста в файл test_results.log, что полезно для дальнейшего анализа или хранения истории тестирования.

Форматирование и обработка ошибок

При работе с кастомными репортерами важно правильно обрабатывать исключения и ошибки, чтобы не прерывать процесс тестирования. Например, можно добавить обработку ошибок при записи в файл:

class SafeFileLoggingReporter {
  constructor() {
    this.logFile = 'test_results.log';
  }

  specDone(result) {
    const logMessage = `Тест: ${result.fullName} | Статус: ${result.status}\n`;

    try {
      fs.appendFileSync(this.logFile, logMessage);
    } catch (error) {
      console.error('Ошибка записи в файл:', error);
    }
  }

  jasmineDone() {
    console.log('Результаты тестов записаны в файл.');
  }
}

jasmine.getEnv().addReporter(new SafeFileLoggingReporter());

В данном примере ошибки при записи в файл не останавливают выполнение тестов, а выводятся в консоль.

Использование внешних библиотек и API

Иногда требуется интегрировать кастомные репортеры с внешними сервисами или библиотеками, например, для отправки уведомлений через Slack или интеграции с системой CI/CD. Пример использования API для отправки результатов тестирования в стороннюю систему:

const axios = require('axios');

class SlackNotifierReporter {
  constructor() {
    this.webhookUrl = 'https://hooks.slack.com/services/your/webhook/url';
  }

  specDone(result) {
    const message = {
      text: `Тест: ${result.fullName} | Статус: ${result.status}`
    };

    axios.post(this.webhookUrl, message)
      .then(response => {
        console.log('Результат отправлен в Slack');
      })
      .catch(error => {
        console.error('Ошибка отправки в Slack:', error);
      });
  }

  jasmineDone() {
    console.log('Все результаты отправлены в Slack.');
  }
}

jasmine.getEnv().addReporter(new SlackNotifierReporter());

Этот репортер отправляет сообщение о результате каждого теста в Slack. Подобные интеграции позволяют быстро информировать команду о статусе тестов.

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

  1. Логирование: Если кастомный репортер пишет логи в файл или в базу данных, важно соблюдать правила хорошей практики по обработке ошибок и синхронизации, чтобы не создавать блокирующие операции.
  2. Гибкость: Репортеры должны быть гибкими и масштабируемыми, чтобы их легко было адаптировать под различные нужды. Например, можно добавить возможность настраивать формат сообщений или цели логирования через параметры конструктора.
  3. Интеграция с CI/CD: При необходимости интеграции с системами CI/CD, следует выбирать такие форматы отчетов, которые поддерживаются интеграционными системами (например, JSON или XML).
  4. Отслеживание метаданных: В некоторых случаях полезно добавлять дополнительные метаданные в отчеты, например, время выполнения теста, окружение, в котором он был выполнен, или версию приложения. Это можно сделать с помощью методов beforeAll или afterAll.

Заключение

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