JSON репортер

Mocha предоставляет возможность создания различных репортеров для вывода результатов тестов. Одним из самых популярных и гибких репортеров является JSON репортер, который позволяет получать результаты тестов в формате JSON. Это удобно для последующей обработки данных, интеграции с CI/CD системами, а также для создания настраиваемых отчетов.

Как настроить JSON репортер

Для того чтобы использовать JSON репортер, необходимо передать соответствующий параметр при запуске Mocha. Это можно сделать через командную строку, указав тип репортера как json.

mocha --reporter json

После выполнения тестов Mocha выведет результат в формате JSON. Этот вывод можно сохранить в файл для дальнейшего использования.

Пример использования JSON репортера

Допустим, у вас есть тестовый файл test.js с несколькими тестами:

const assert = require('assert');

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.strictEqual([1, 2, 3].indexOf(4), -1);
    });
    it('should return the index when the value is present', function() {
      assert.strictEqual([1, 2, 3].indexOf(2), 1);
    });
  });
});

Теперь, если запустить Mocha с параметром --reporter json, результаты тестирования будут выглядеть как JSON-структура, например:

mocha --reporter json > results.json

Содержимое файла results.json будет таким:

{
  "stats": {
    "suites": 1,
    "tests": 2,
    "passes": 2,
    "failures": 0,
    "duration": 10
  },
  "tests": [
    {
      "title": "Array #indexOf() should return -1 when the value is not present",
      "fullTitle": "Array #indexOf() should return -1 when the value is not present",
      "duration": 2,
      "state": "passed"
    },
    {
      "title": "Array #indexOf() should return the index when the value is present",
      "fullTitle": "Array #indexOf() should return the index when the value is present",
      "duration": 3,
      "state": "passed"
    }
  ],
  "failures": [],
  "passes": [
    {
      "title": "Array #indexOf() should return -1 when the value is not present",
      "fullTitle": "Array #indexOf() should return -1 when the value is not present",
      "duration": 2
    },
    {
      "title": "Array #indexOf() should return the index when the value is present",
      "fullTitle": "Array #indexOf() should return the index when the value is present",
      "duration": 3
    }
  ]
}

Этот JSON-объект содержит полезную информацию о всех тестах, таких как:

  • stats — общая статистика тестов (общее количество тестов, количество пройденных и проваленных тестов, общее время выполнения).
  • tests — подробности о каждом тесте, включая его название, продолжительность и статус.
  • failures — список неудачных тестов.
  • passes — список успешных тестов.

Детали структуры JSON отчета

  1. stats:

    • suites: количество групп тестов (например, количество describe блоков).
    • tests: общее количество тестов.
    • passes: количество успешно пройденных тестов.
    • failures: количество неудачных тестов.
    • duration: общее время выполнения тестов в миллисекундах.
  2. tests: Каждый тест в этом разделе содержит:

    • title: название теста.
    • fullTitle: полное название теста, включая название группы (например, Array #indexOf() should return -1 when the value is not present).
    • duration: продолжительность выполнения теста в миллисекундах.
    • state: состояние теста (passed или failed).
  3. failures и passes: Эти разделы содержат массивы с результатами успешных и неудачных тестов соответственно. Каждый объект в этих массивах аналогичен объектам в разделе tests, но включает только те тесты, которые прошли успешно или не прошли.

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

  1. Автоматизация отчетности: JSON формат позволяет легко интегрировать результаты тестирования в другие системы. Например, можно передать результаты в систему CI (например, Jenkins) или в специализированные системы отчетности для их визуализации и анализа.

  2. Гибкость в обработке: Так как результаты предоставляются в структурированном формате JSON, они могут быть использованы для написания кастомных скриптов обработки. Это позволяет фильтровать, сортировать или агрегировать данные по мере необходимости.

  3. Интеграция с другими инструментами: Благодаря стандартизированному формату JSON, данные можно интегрировать с различными инструментами для анализа тестов, такими как Dashboard-ы или системы мониторинга.

  4. Поддержка многократного использования: Отчет в формате JSON можно сохранить и использовать повторно, например, для построения графиков или анализа трендов в прохождении тестов.

Пример обработки JSON отчета

Рассмотрим пример обработки JSON отчета с помощью Node.js. Пусть у нас есть файл с результатами тестирования, который мы получили через Mocha:

{
  "stats": {
    "suites": 1,
    "tests": 2,
    "passes": 2,
    "failures": 0,
    "duration": 10
  },
  "tests": [
    {
      "title": "Array #indexOf() should return -1 when the value is not present",
      "fullTitle": "Array #indexOf() should return -1 when the value is not present",
      "duration": 2,
      "state": "passed"
    },
    {
      "title": "Array #indexOf() should return the index when the value is present",
      "fullTitle": "Array #indexOf() should return the index when the value is present",
      "duration": 3,
      "state": "passed"
    }
  ],
  "failures": [],
  "passes": [
    {
      "title": "Array #indexOf() should return -1 when the value is not present",
      "fullTitle": "Array #indexOf() should return -1 when the value is not present",
      "duration": 2
    },
    {
      "title": "Array #indexOf() should return the index when the value is present",
      "fullTitle": "Array #indexOf() should return the index when the value is present",
      "duration": 3
    }
  ]
}

Воспользуемся Node.js для анализа этого JSON файла:

const fs = require('fs');

fs.readFile('results.json', 'utf8', (err, data) => {
  if (err) throw err;

  const report = JSON.parse(data);
  
  const totalTests = report.stats.tests;
  const passedTests = report.stats.passes;
  const failedTests = report.stats.failures;

  console.log(`Total Tests: ${totalTests}`);
  console.log(`Passed Tests: ${passedTests}`);
  console.log(`Failed Tests: ${failedTests}`);

  report.tests.forEach(test => {
    console.log(`${test.fullTitle} - ${test.state}`);
  });
});

Этот скрипт прочитает файл results.json, извлечет из него данные о тестах и выведет статистику по общему количеству тестов, пройденным и проваленным тестам, а также названия тестов с их состоянием.

Заключение

Использование JSON репортера в Mocha дает мощные возможности для анализа и обработки результатов тестов. Это позволяет интегрировать Mocha с различными внешними системами, а также писать кастомные инструменты для обработки отчетов. В условиях сложных проектов, где тестирование играет ключевую роль, такой подход помогает повысить прозрачность тестов и улучшить процессы разработки.