Форматирование вывода

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

Стандартный вывод

По умолчанию Jasmine выводит информацию о прохождении тестов в консоль, где отображаются:

  • Названия тестов и их состояние (пройден/не пройден).
  • Сообщения об ошибках (если тест не прошел).
  • Статистика по количеству пройденных и не пройденных тестов.

Пример стандартного вывода:

Suite: Example Suite
  ✓ should add numbers correctly
  ✗ should subtract numbers correctly
    Expected 4 to equal 3.

2 specs, 1 failure, 0 skipped, 1 passed, 0 pending, 0 excluded, 0 disabled, 0 total

Здесь видно:

  • Название каждого теста (например, should add numbers correctly).
  • Статус выполнения теста: галочка () для успешного и крестик () для неудачного.
  • Причины неудачи, если они есть, с соответствующими сообщениями об ошибках.

Форматирование с помощью Reporters

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

  • Jasmine Spec Reporter — простое и лаконичное отображение результатов с учетом предпочтений команд.
  • JUnit Reporter — вывод в формате, совместимом с системой непрерывной интеграции (CI).
  • TeamCity Reporter — специализированный вывод для системы TeamCity.

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

  1. Установить репортер через npm:

    npm install jasmine-spec-reporter --save-dev
  2. Настроить репортер в конфигурации Jasmine (обычно файл jasmine.json или в JavaScript-коде):

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

jasmine.getEnv().addReporter(new JasmineSpecReporter({
  spec: {
    displayPending: true,  // Показывать ожидающие тесты
    displayDuration: true  // Показать длительность выполнения теста
  }
}));

После этого вывод будет более структурированным и удобным для восприятия:

Example Suite
  ✓ should add numbers correctly
  ✗ should subtract numbers correctly
    Expected 4 to equal 3.

2 specs, 1 failure, 0 skipped, 1 passed

Пользовательские репортеры

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

  • specStarted(spec) — вызывается при запуске каждого теста.
  • specDone(spec) — вызывается после завершения каждого теста.
  • suiteStarted(suite) — вызывается при запуске тестового набора.
  • suiteDone(suite) — вызывается после завершения тестового набора.

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

class CustomReporter {
  specDone(result) {
    const fs = require('fs');
    const log = `Test: ${result.fullName}\nStatus: ${result.status}\n`;
    fs.appendFileSync('test_results.log', log);
  }
}

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

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

Цветной вывод

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

Пример использования chalk для цветного вывода:

const chalk = require('chalk');

jasmine.getEnv().addReporter({
  specDone(result) {
    if (result.status === 'failed') {
      console.log(chalk.red(`Test Failed: ${result.fullName}`));
    } else {
      console.log(chalk.green(`Test Passed: ${result.fullName}`));
    }
  }
});

Здесь, если тест не прошел, его название будет выводиться красным цветом, а если прошел — зеленым.

Поддержка асинхронных тестов

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

Пример с асинхронным тестом и длительностью:

describe('Async Tests', function() {
  it('should complete an async operation within a certain time', function(done) {
    setTimeout(function() {
      expect(true).toBe(true);
      done();
    }, 1000);
  });
});

В результате выполнения этого теста репортер отобразит время, затраченное на выполнение, если опция displayDuration включена.

Вывод в формате JUnit

JUnit является популярным форматом вывода для систем CI/CD. Jasmine поддерживает вывод в этот формат через репортер JUnit. Это полезно для интеграции с Jenkins, GitLab CI, Travis и другими инструментами.

Чтобы использовать JUnit репортер:

  1. Установить соответствующий пакет:

    npm install jasmine-reporters --save-dev
  2. Настроить вывод в конфигурации:

const JasmineReporters = require('jasmine-reporters');

jasmine.getEnv().addReporter(new JasmineReporters.JUnitXmlReporter({
  savePath: './reports',
  consolidateAll: true
}));

Этот репортер генерирует отчет в формате XML, который можно загрузить в системы CI.

Параллельный запуск и вывод

Для более быстрого выполнения тестов можно запускать их параллельно. В Jasmine поддержка параллельного запуска тестов доступна через использование различных инструментов, например, с помощью плагина jasmine-parallel или настроек для запуска через систему CI.

Пример использования плагина jasmine-parallel:

  1. Установить плагин:

    npm install jasmine-parallel --save-dev
  2. Запустить Jasmine с конфигурацией для параллельного тестирования:

const JasmineParallel = require('jasmine-parallel');

const jasmine = new JasmineParallel();
jasmine.loadConfigFile('jasmine.json');
jasmine.execute();

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

Вывод статистики

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

Вывод с пропуском тестов и приостановленными тестами

Jasmine позволяет маркировать тесты как “pending” (ожидающие) или “disabled” (приостановленные). Эти тесты могут быть исключены из основного вывода или показаны отдельно, что помогает в процессе разработки.

Для пропущенных тестов можно использовать следующее:

it('should be skipped', function() {
  pending();
});

Тесты, помеченные как pending(), будут отображаться как “Пропущено” в итоговом отчете.

Вывод может выглядеть следующим образом:

Suite: Example Suite
  ✓ should add numbers correctly
  ✗ should subtract numbers correctly
  - should be skipped

Таким образом, Jasmine предоставляет гибкие средства для настройки вывода результатов тестов, что помогает адаптировать его под конкретные требования разработки и интеграции с другими инструментами и сервисами.