Логирование и вывод результатов

Эффективное логирование и корректный вывод результатов являются ключевыми аспектами автоматизированного тестирования с использованием Protractor. Они позволяют отслеживать ход выполнения тестов, выявлять ошибки, а также формировать отчёты для анализа стабильности приложения.


Основные подходы к логированию

Protractor, будучи надстройкой над Selenium WebDriver для Angular-приложений, не предоставляет встроенной системы логирования уровня приложения, но тесно интегрируется с Node.js, что позволяет использовать стандартные методы и сторонние библиотеки.

1. Использование console.log

Простейший способ вывести информацию о ходе теста:

it('should log page title', async () => {
    const title = await browser.getTitle();
    console.log('Page title is:', title);
});
  • Позволяет отслеживать значения переменных и состояния элементов.
  • Недостаток — вывод идет в консоль без структурирования, что неудобно при больших наборах тестов.

2. Библиотека log4js для структурированного логирования

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

const log4js = require('log4js');

log4js.configure({
  appenders: { file: { type: 'file', filename: 'protractor.log' } },
  categories: { default: { appenders: ['file'], level: 'info' } }
});

const logger = log4js.getLogger('default');

it('should log with log4js', async () => {
    const title = await browser.getTitle();
    logger.info('Current page title:', title);
});
  • Позволяет классифицировать логи по уровням: info, warn, error, debug.
  • Удобно для анализа исторических данных и CI/CD интеграции.

Асинхронное логирование

Protractor полностью использует асинхронную модель JavaScript с async/await. Важно корректно обрабатывать промисы при логировании:

it('should wait for element and log text', async () => {
    const elem = element(by.css('.message'));
    await browser.wait(protractor.ExpectedConditions.visibilityOf(elem), 5000);
    const text = await elem.getText();
    console.log('Message text:', text);
});
  • Без await вывод может быть некорректным, так как промис ещё не разрешён.
  • Использование ExpectedConditions помогает логировать только после гарантированного появления элемента.

Конфигурация Protractor для логирования

Файл конфигурации protractor.conf.js позволяет включать логирование уровня WebDriver и Protractor:

exports.config = {
  capabilities: {
    browserName: 'chrome'
  },
  framework: 'jasmine',
  onPrepare: () => {
    browser.manage().logs().get('browser').then(logs => {
        logs.forEach(log => console.log(log.message));
    });
  },
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 60000
  }
};
  • browser.manage().logs().get('browser') позволяет получить логи консоли браузера.
  • Можно дополнительно фильтровать по уровню SEVERE, WARNING, INFO.

Использование кастомных репортеров

Protractor поддерживает подключение репортеров Jasmine или Mocha для расширенного вывода результатов:

1. Jasmine Spec Reporter

const { SpecReporter } = require('jasmine-spec-reporter');

jasmine.getEnv().clearReporters();
jasmine.getEnv().addReporter(new SpecReporter({
    spec: { displayStacktrace: true }
}));
  • Отображает результаты тестов с детальной информацией о каждом spec.
  • Возможность включить вывод трассировки ошибок.

2. Allure Reporter

Allure позволяет создавать наглядные HTML-отчёты с логами шагов, скриншотами и вложениями:

const { AllureReporter } = require('jasmine-allure2-reporter');

jasmine.getEnv().addReporter(new AllureReporter({ resultsDir: 'allure-results' }));
  • Каждое действие можно логировать как шаг:
allure.createStep('Проверка заголовка страницы', async () => {
    const title = await browser.getTitle();
    console.log('Title:', title);
})();
  • Подходит для комплексного анализа тестового покрытия и интеграции с CI.

Логирование ошибок и исключений

Protractor позволяет перехватывать ошибки выполнения тестов для детального анализа:

it('should handle errors', async () => {
    try {
        const nonExistent = element(by.css('.not-found'));
        await nonExistent.click();
    } catch (error) {
        console.error('Caught error:', error.message);
    }
});
  • Позволяет записывать ошибки в лог-файл и предотвращать падение всего теста.
  • Можно комбинировать с репортерами для генерации структурированных отчётов.

Практические рекомендации

  • Использовать структурированные логи вместо console.log для больших проектов.
  • Асинхронные операции всегда логировать с await.
  • Интегрировать логирование с репортерами для визуального анализа.
  • Отдельно хранить логи браузера и серверные логи для удобного дебага.
  • Устанавливать уровни логирования (info, warn, error) для фильтрации важных сообщений.

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