Jasmine предоставляет встроенные средства для вывода результатов тестирования, включая стандартный репортер, который выводит результаты в консоль. Однако часто требуется более сложный контроль над выводом или интеграция с внешними системами для логирования, отчетности или других целей. Для таких случаев Jasmine позволяет создавать собственные репортеры.
Репортеры в Jasmine — это механизмы, которые обрабатывают результаты тестов и отображают их пользователю в том или ином формате. По умолчанию Jasmine использует консольный репортер, который выводит результаты в виде текста в стандартный вывод (консоль). Однако в большинстве случаев необходимо кастомизировать вывод для более удобной или специфической отчетности.
Репортеры в Jasmine должны быть реализованы как объект, который реализует один или несколько методов, связанных с жизненным циклом тестов. В частности, для создания кастомного репортера нужно реализовать следующие методы:
jasmine.getEnv() — позволяет получить
окружение Jasmine.initialize() — инициализация
репортера.specStarted() — вызывается, когда
начинается выполнение теста.specDone() — вызывается, когда тест
завершен.suiteStarted() — вызывается перед
запуском набора тестов (свита).suiteDone() — вызывается после
завершения набора тестов.Jasmine done() — вызывается после
завершения всего тестового процесса.Кастомный репортер можно зарегистрировать в Jasmine через метод
jasmine.getEnv().addReporter(), который добавляет новый
репортер в тестовую среду.
Пример простого репортера, который выводит название каждого теста и его результат:
class CustomReporter {
specStarted(result) {
console.log('Тест начат: ' + result.fullName);
}
specDone(result) {
if (result.status === 'passed') {
console.log(`Тест ${result.fullName} прошел`);
} else if (result.status === 'failed') {
console.log(`Тест ${result.fullName} не прошел`);
console.log('Причина: ' + result.failedExpectations[0].message);
}
}
jasmineDone() {
console.log('Тестирование завершено.');
}
}
jasmine.getEnv().addReporter(new CustomReporter());
В данном примере репортер будет выводить информацию о каждом тесте в процессе его выполнения. Если тест не прошел, выводится причина ошибки.
В реальных проектах часто нужно добавлять дополнительные возможности в кастомные репортеры, такие как логирование в файл, отправка результатов на сервер или интеграция с внешними системами (например, Jira или Slack). Пример, где репортер отправляет информацию о статусе тестов в файл:
const fs = require('fs');
class FileLoggingReporter {
constructor() {
this.logFile = 'test_results.log';
}
specDone(result) {
const logMessage = `Тест: ${result.fullName} | Статус: ${result.status}\n`;
fs.appendFileSync(this.logFile, logMessage);
}
jasmineDone() {
console.log('Результаты тестов записаны в файл.');
}
}
jasmine.getEnv().addReporter(new FileLoggingReporter());
Этот репортер записывает результаты каждого теста в файл
test_results.log, что полезно для дальнейшего анализа или
хранения истории тестирования.
При работе с кастомными репортерами важно правильно обрабатывать исключения и ошибки, чтобы не прерывать процесс тестирования. Например, можно добавить обработку ошибок при записи в файл:
class SafeFileLoggingReporter {
constructor() {
this.logFile = 'test_results.log';
}
specDone(result) {
const logMessage = `Тест: ${result.fullName} | Статус: ${result.status}\n`;
try {
fs.appendFileSync(this.logFile, logMessage);
} catch (error) {
console.error('Ошибка записи в файл:', error);
}
}
jasmineDone() {
console.log('Результаты тестов записаны в файл.');
}
}
jasmine.getEnv().addReporter(new SafeFileLoggingReporter());
В данном примере ошибки при записи в файл не останавливают выполнение тестов, а выводятся в консоль.
Иногда требуется интегрировать кастомные репортеры с внешними сервисами или библиотеками, например, для отправки уведомлений через Slack или интеграции с системой CI/CD. Пример использования API для отправки результатов тестирования в стороннюю систему:
const axios = require('axios');
class SlackNotifierReporter {
constructor() {
this.webhookUrl = 'https://hooks.slack.com/services/your/webhook/url';
}
specDone(result) {
const message = {
text: `Тест: ${result.fullName} | Статус: ${result.status}`
};
axios.post(this.webhookUrl, message)
.then(response => {
console.log('Результат отправлен в Slack');
})
.catch(error => {
console.error('Ошибка отправки в Slack:', error);
});
}
jasmineDone() {
console.log('Все результаты отправлены в Slack.');
}
}
jasmine.getEnv().addReporter(new SlackNotifierReporter());
Этот репортер отправляет сообщение о результате каждого теста в Slack. Подобные интеграции позволяют быстро информировать команду о статусе тестов.
beforeAll
или afterAll.Кастомные репортеры позволяют значительно расширить возможности стандартной отчетности в Jasmine. С их помощью можно реализовать как простое логирование в консоль, так и сложные интеграции с внешними сервисами и системами. Создание кастомных репортеров — важный инструмент для любого тестировщика, работающего с Jasmine, который помогает адаптировать процесс тестирования под специфические требования проекта.