Mocha предоставляет возможность создания различных репортеров для вывода результатов тестов. Одним из самых популярных и гибких репортеров является JSON репортер, который позволяет получать результаты тестов в формате JSON. Это удобно для последующей обработки данных, интеграции с CI/CD системами, а также для создания настраиваемых отчетов.
Для того чтобы использовать JSON репортер, необходимо передать
соответствующий параметр при запуске Mocha. Это можно сделать через
командную строку, указав тип репортера как json.
mocha --reporter json
После выполнения тестов Mocha выведет результат в формате 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:
suites: количество групп тестов (например, количество
describe блоков).tests: общее количество тестов.passes: количество успешно пройденных тестов.failures: количество неудачных тестов.duration: общее время выполнения тестов в
миллисекундах.tests: Каждый тест в этом разделе содержит:
title: название теста.fullTitle: полное название теста, включая название
группы (например,
Array #indexOf() should return -1 when the value is not present).duration: продолжительность выполнения теста в
миллисекундах.state: состояние теста (passed или
failed).failures и passes: Эти разделы содержат массивы
с результатами успешных и неудачных тестов соответственно. Каждый объект
в этих массивах аналогичен объектам в разделе tests, но
включает только те тесты, которые прошли успешно или не прошли.
Автоматизация отчетности: JSON формат позволяет легко интегрировать результаты тестирования в другие системы. Например, можно передать результаты в систему CI (например, Jenkins) или в специализированные системы отчетности для их визуализации и анализа.
Гибкость в обработке: Так как результаты предоставляются в структурированном формате JSON, они могут быть использованы для написания кастомных скриптов обработки. Это позволяет фильтровать, сортировать или агрегировать данные по мере необходимости.
Интеграция с другими инструментами: Благодаря стандартизированному формату JSON, данные можно интегрировать с различными инструментами для анализа тестов, такими как Dashboard-ы или системы мониторинга.
Поддержка многократного использования: Отчет в формате 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 с различными внешними системами, а также писать кастомные инструменты для обработки отчетов. В условиях сложных проектов, где тестирование играет ключевую роль, такой подход помогает повысить прозрачность тестов и улучшить процессы разработки.