Reporter interface

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

Jasmine предоставляет несколько встроенных репортеров, таких как ConsoleReporter и HTMLReporter, однако интерфейс Reporter позволяет создавать и использовать собственные репортеры для специфичных нужд проекта. Он предоставляет разработчику полный контроль над тем, как отображать или записывать результаты тестирования.

Основные методы интерфейса Reporter

Интерфейс Reporter определяет несколько методов, которые необходимо реализовать, чтобы создать кастомный репортер. Вот список ключевых методов, которые можно использовать:

  1. jasmineStarted(info) Этот метод вызывается в самом начале выполнения тестов. Он получает объект info, который содержит информацию о тестовом запуске, например, количество тестов и суффикс времени.

    Пример:

    jasmineStarted: function(info) {
        console.log(`Тесты начинаются: ${info.totalSpecsDefined} тестов будут выполнены`);
    }
  2. suiteStarted(suite) Метод вызывается при старте каждого тестового набора (suite). Параметр suite содержит информацию о тестовом наборе, в том числе его имя.

    Пример:

    suiteStarted: function(suite) {
        console.log(`Начат набор тестов: ${suite.description}`);
    }
  3. specStarted(spec) Этот метод вызывается при старте каждого теста (spec). Параметр spec содержит описание теста, а также статус его выполнения.

    Пример:

    specStarted: function(spec) {
        console.log(`Начат тест: ${spec.description}`);
    }
  4. specDone(result) Метод вызывается по завершении каждого теста. Параметр result содержит подробную информацию о выполнении теста, такую как статус (прошел или не прошел), время выполнения, ошибки и другие данные.

    Пример:

    specDone: function(result) {
        console.log(`Тест завершен: ${result.description}`);
        console.log(`Статус: ${result.status}`);
    }
  5. suiteDone(suite) Этот метод вызывается по завершении тестового набора. Параметр suite содержит информацию о тестовом наборе, включая его имя, количество прошедших тестов и других данных.

    Пример:

    suiteDone: function(suite) {
        console.log(`Набор тестов завершен: ${suite.description}`);
        console.log(`Пройдено тестов: ${suite.failedExpectations.length}`);
    }
  6. jasmineDone(result) Метод вызывается по завершении всех тестов. Параметр result предоставляет информацию о результатах всего запуска тестов, включая количество успешных и неуспешных тестов, ошибки и другие метрики.

    Пример:

    jasmineDone: function(result) {
        console.log(`Тесты завершены!`);
        console.log(`Успешные тесты: ${result.success}`);
        console.log(`Неудачные тесты: ${result.failedExpectations.length}`);
    }

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

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

function MyCustomReporter() {
    this.jasmineStarted = function(info) {
        console.log(`Начало выполнения тестов. Общее количество тестов: ${info.totalSpecsDefined}`);
    };

    this.suiteStarted = function(suite) {
        console.log(`Набор тестов начинается: ${suite.description}`);
    };

    this.specStarted = function(spec) {
        console.log(`Тест начинается: ${spec.description}`);
    };

    this.specDone = function(result) {
        console.log(`Тест завершен: ${result.description}`);
        console.log(`Статус: ${result.status}`);
        if (result.failedExpectations.length > 0) {
            result.failedExpectations.forEach(function(failure) {
                console.log(`Ошибка: ${failure.message}`);
            });
        }
    };

    this.suiteDone = function(suite) {
        console.log(`Набор тестов завершен: ${suite.description}`);
    };

    this.jasmineDone = function(result) {
        console.log(`Завершение выполнения всех тестов.`);
        console.log(`Успех: ${result.success}`);
        console.log(`Неудачи: ${result.failedExpectations.length}`);
    };
}

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

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

Преимущества использования кастомных репортеров

  1. Гибкость и контроль Используя кастомные репортеры, можно настроить вывод результатов тестирования в любой желаемой форме, будь то текстовый файл, HTML-отчет, интеграция с системами CI/CD или внешними сервисами мониторинга.

  2. Логирование и отладка Репортеры могут быть полезны для более детальной отладки тестов. Например, можно записывать подробные логи о том, какие тесты выполняются, сколько времени занимает каждый тест, и что происходит при их провале.

  3. Интеграция с другими системами Кастомный репортер может быть настроен для отправки отчетов в систему мониторинга, такую как Slack, или же создавать отчеты в формате JSON или XML для дальнейшей обработки.

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

Использование репортеров в CI/CD

Репортеры особенно полезны в средах непрерывной интеграции и доставки (CI/CD), где важно получить отчетность о выполнении тестов и их результатах.

Для использования репортеров в таких системах можно подключить репортеры, генерирующие отчеты в формате JUnit XML или JSON. Эти форматы легко интегрируются с инструментами отчетности, такими как Jenkins или GitLab CI.

Пример подключения репортера для генерации JUnit отчета:

jasmine.getEnv().addReporter(new JasmineReporter({
    captureExceptions: true,
    reportFile: 'test-results.xml',
    junit: true
}));

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

Репортеры могут быть полезны для интеграции с такими внешними сервисами, как Codecov, SonarQube и другие системы, использующие метрики покрытия кода или качество тестов. Такие репортеры обычно генерируют отчеты в специфичных форматах, которые могут быть отправлены на сервер.

В этом случае репортер не только будет записывать информацию о выполнении тестов, но и передавать результаты в соответствующие API сервисов.

Заключение

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