Создание кастомных отчётов

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

Интеграция с Jasmine Reporter

Jasmine Reporter — это основной способ расширения отчётности в Protractor при использовании Jasmine. Для подключения кастомного репортера выполняются следующие шаги:

  1. Установка зависимостей:
npm install jasmine-reporters --save-dev
  1. Подключение репортера в конфигурации Protractor:
const JasmineReporters = require('jasmine-reporters');

exports.config = {
  framework: 'jasmine',
  onPrepare: function() {
    jasmine.getEnv().addReporter(new JasmineReporters.JUnitXmlReporter({
      savePath: 'test-results',
      consolidateAll: false
    }));
  }
};

Пояснение параметров:

  • savePath — путь к папке, куда сохраняются отчёты.
  • consolidateAll — если false, создаются отдельные файлы на каждый тест; если true, все результаты объединяются в один файл.

Создание собственного репортера

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

class CustomReporter {
  jasmineStarted(suiteInfo) {
    console.log(`Начало выполнения: ${suiteInfo.totalSpecsDefined} тестов`);
  }

  specStarted(result) {
    console.log(`Начало теста: ${result.fullName}`);
  }

  specDone(result) {
    const status = result.status.toUpperCase();
    console.log(`Тест ${result.fullName} завершён со статусом ${status}`);
    if (result.failedExpectations.length) {
      result.failedExpectations.forEach(failure => {
        console.log(`Ошибка: ${failure.message}`);
      });
    }
  }

  jasmineDone() {
    console.log('Выполнение всех тестов завершено');
  }
}

exports.config = {
  framework: 'jasmine',
  onPrepare: function() {
    jasmine.getEnv().addReporter(new CustomReporter());
  }
};

Ключевые моменты кастомного репортера:

  • jasmineStarted — вызывается один раз перед началом всех тестов.
  • specStarted — вызывается перед выполнением каждого теста.
  • specDone — вызывается после завершения каждого теста.
  • jasmineDone — вызывается после завершения всех тестов.

Логирование и скриншоты

Кастомные репортеры можно интегрировать со средствами Protractor для снятия скриншотов при падении теста:

const fs = require('fs');

class ScreenshotReporter {
  specDone(result) {
    if (result.status === 'failed') {
      browser.takeScreenshot().then(png => {
        const stream = fs.createWriteStream(`screenshots/${result.fullName}.png`);
        stream.write(Buffer.from(png, 'base64'));
        stream.end();
      });
    }
  }
}

exports.config = {
  framework: 'jasmine',
  onPrepare: function() {
    jasmine.getEnv().addReporter(new ScreenshotReporter());
  }
};

Особенности работы со скриншотами:

  • Используется метод browser.takeScreenshot(), который возвращает изображение в формате base64.
  • Файлы можно сохранять с именами тестов для удобного поиска и анализа.
  • Можно дополнительно интегрировать с HTML-репортерами для визуализации.

Интеграция с HTML-репортами

Для удобного представления результатов в виде HTML можно использовать пакет protractor-html-reporter-2:

npm install protractor-html-reporter-2 --save-dev

Пример конфигурации генерации отчёта после тестов:

const reporter = require('protractor-html-reporter-2');

onComplete: function() {
  const testConfig = {
    reportTitle: 'Protractor Тесты',
    outputPath: './reports',
    screenshotsFolder: 'screenshots',
    testBrowser: 'Chrome',
    screenshotsOnlyOnFailure: true
  };
  reporter.generate(testConfig);
}

Важные возможности:

  • Автоматическое включение скриншотов.
  • Настраиваемый стиль отчёта и структура файлов.
  • Совмещение нескольких XML-отчётов в единый HTML-файл.

Лучшие практики создания кастомных отчётов

  • Разделение ответственности: логирование шагов теста, генерация скриншотов и создание HTML-отчётов лучше реализовывать через отдельные классы или модули.
  • Понятные имена файлов: использовать имя теста и временную метку для уникальности скриншотов.
  • Асинхронная обработка: при работе с файлами и скриншотами всегда использовать промисы или async/await.
  • Централизованная настройка: все пути и настройки репортера хранить в конфигурационном файле.

Примеры расширений

  • Добавление логов API-запросов в отчёт.
  • Сравнение ожидаемого и фактического состояния UI и сохранение данных.
  • Генерация статистики по прохождению тестов (процент успешных, среднее время выполнения).

Кастомные отчёты в Protractor позволяют создавать полностью управляемую систему отчётности, адаптированную под требования конкретного проекта, включая визуализацию, хранение и детализированное логирование.