Создание custom reporters

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

Основы создания custom reporters

Для начала следует разобраться с базовыми принципами работы стандартных репортеров Jasmine. Репортеры являются объектами, которые реализуют интерфейс Reporter. Они подключаются к процессу выполнения тестов и получают обновления о текущем состоянии тестов через определенные методы.

Репортеры могут быть использованы для вывода результатов тестов в консоль, записи в файл или отправки уведомлений в сторонние системы. Чтобы создать свой собственный репортер, достаточно реализовать объект, который будет соответствовать нужным методам из интерфейса Reporter.

Структура и методы custom reporter

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

  • initialize(): Этот метод вызывается при инициализации репортера, до того как начнутся тесты. Здесь можно настроить внутренние переменные или подключить другие необходимые модули.
  • jasmineStarted(): Этот метод вызывается, когда начинаются тесты. В нем можно выводить информацию об общем количестве тестов.
  • suiteStarted(): Вызывается при запуске каждого набора тестов (describe). Позволяет отслеживать начало каждого тестового сета.
  • specStarted(): Этот метод вызывается, когда начинается выполнение отдельного теста (it).
  • specDone(): Вызывается после завершения теста (it). Этот метод предоставляет информацию о том, прошел ли тест, и какие были ошибки.
  • suiteDone(): Вызывается после завершения выполнения набора тестов.
  • jasmineDone(): Этот метод вызывается, когда тесты завершены. Здесь можно подвести итоги, например, записать результаты в файл или отправить на сервер.

Пример простого custom репортера

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

function CustomReporter() {
  this.jasmineStarted = function() {
    console.log('Тесты начались');
  };

  this.specStarted = function(result) {
    console.log('Начинается тест: ' + result.fullName);
  };

  this.specDone = function(result) {
    if (result.status === 'passed') {
      console.log('Тест ' + result.fullName + ' прошел');
    } else {
      console.log('Тест ' + result.fullName + ' не прошел');
      console.log('Ошибка: ' + result.failedExpectations[0].message);
    }
  };

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

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

В данном примере реализованы базовые методы для вывода сообщений в консоль о ходе выполнения тестов. Метод specDone проверяет результат каждого теста и выводит, прошел ли он, или нет.

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

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

Для этого достаточно изменить метод jasmineDone(), чтобы, например, данные о тестах отправлялись на внешний сервер в формате JSON:

function CustomReporter() {
  this.jasmineStarted = function() {
    this.testResults = [];
  };

  this.specDone = function(result) {
    this.testResults.push({
      spec: result.fullName,
      status: result.status,
      error: result.failedExpectations.length ? result.failedExpectations[0].message : null
    });
  };

  this.jasmineDone = function() {
    // Отправка результатов на сервер
    fetch('https://example.com/api/test-results', {
      method: 'POST',
      body: JSON.stringify(this.testResults),
      headers: {
        'Content-Type': 'application/json'
      }
    })
    .then(response => response.json())
    .then(data => console.log('Результаты отправлены на сервер'))
    .catch(error => console.error('Ошибка при отправке результатов:', error));
  };
}

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

В этом примере данные о каждом тесте сохраняются в массиве testResults, и после завершения тестирования отправляются на сервер с помощью fetch().

Использование сторонних библиотек для создания репортеров

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

Jasmine-Spec-Reporter предоставляет более приятный формат вывода информации о тестах, а также позволяет добавлять дополнительные фичи, такие как вывод времени выполнения тестов, цветовая подсветка и т.д. Для использования этой библиотеки достаточно установить ее через npm и добавить в конфигурацию Jasmine.

npm install jasmine-spec-reporter --save-dev

Далее в конфигурации Jasmine добавляется код для подключения и использования репортера:

const SpecReporter = require('jasmine-spec-reporter').SpecReporter;

jasmine.getEnv().addReporter(new SpecReporter({
  spec: {
    displayPending: true,
    displayDuration: true
  },
  summary: {
    displayFailed: true,
    displayPending: true
  }
}));

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

Обработка ошибок и исключений

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

Пример обработки ошибок при отправке данных:

this.jasmineDone = function() {
  try {
    fetch('https://example.com/api/test-results', {
      method: 'POST',
      body: JSON.stringify(this.testResults),
      headers: { 'Content-Type': 'application/json' }
    })
    .then(response => response.json())
    .then(data => console.log('Результаты отправлены на сервер'))
    .catch(error => {
      console.error('Ошибка при отправке результатов:', error);
    });
  } catch (error) {
    console.error('Ошибка при обработке результатов:', error);
  }
};

Такой подход позволяет избежать краха тестов из-за сбоев внешних систем и обеспечить большую устойчивость репортера.

Заключение

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