Анализ результатов тестов

Protractor — это инструмент для end-to-end тестирования Angular и AngularJS приложений, работающий поверх WebDriverJS. Эффективный анализ результатов тестов требует понимания того, как Protractor генерирует отчёты, обрабатывает ошибки и интегрируется с системами Continuous Integration (CI).


Логирование и консольные сообщения

Protractor выводит результаты выполнения тестов в консоль в реальном времени. Ключевые моменты:

  • Статусы тестов: Каждый тест в Jasmine или Mocha отображается как passed, failed или skipped.
  • Ошибки исполнения: Исключения, возникающие при обращении к элементам, логируются с указанием стека вызовов.
  • Асинхронные операции: Поскольку Protractor работает с промисами WebDriver, важно правильно обрабатывать асинхронность, чтобы ошибки не терялись в логах.

Для удобства анализа в консоли можно использовать флаги запуска:

protractor conf.js --specs=specs/*.spec.js --params.env=dev

При этом --params.env позволяет динамически менять окружение для тестов.


Использование Jasmine Reporters

Jasmine Reporters предоставляют расширенные возможности вывода результатов:

  • JUnitXmlReporter генерирует XML-файлы, пригодные для CI-систем (например, Jenkins).
  • SpecReporter улучшает читаемость логов в консоли, показывая структуру тестов, статус каждого шага и подробные сообщения об ошибках.

Пример конфигурации SpecReporter:

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

exports.config = {
  framework: 'jasmine',
  onPrepare: () => {
    jasmine.getEnv().addReporter(new SpecReporter({
      spec: {
        displayStacktrace: true,
        displaySuccessful: true,
        displayFailed: true,
      }
    }));
  }
};

Сбор скриншотов при ошибках

Для диагностики UI-проблем важны скриншоты:

afterEach(async () => {
  if (jasmine.getEnv().currentSpec.failedExpectations.length > 0) {
    const png = await browser.takeScreenshot();
    require('fs').writeFileSync('screenshots/' + Date.now() + '.png', png, { encoding: 'base64' });
  }
});

Особенности:

  • Скриншоты сохраняются только при падении теста.
  • Формат base64 обеспечивает совместимость с CI и HTML-отчётами.

Генерация HTML-отчётов

Для наглядного анализа полезны HTML-отчёты:

  • protractor-beautiful-reporter и protractor-html-reporter-2 создают отчёты с визуализацией тестов и скриншотами.
  • Отчёт содержит: общее количество тестов, прошедшие и упавшие тесты, время выполнения, ссылки на скриншоты.

Пример интеграции с protractor-beautiful-reporter:

const HtmlReporter = require('protractor-beautiful-reporter');

exports.config = {
  onPrepare: () => {
    jasmine.getEnv().addReporter(new HtmlReporter({
      baseDirectory: 'reports/screenshots'
    }).getJasmine2Reporter());
  }
};

Анализ падений тестов

Основные причины ошибок в Protractor:

  1. Элементы не найдены (NoSuchElementError) — чаще всего связаны с асинхронной загрузкой страниц. Решается использованием ExpectedConditions:
const EC = protractor.ExpectedConditions;
await browser.wait(EC.visibilityOf(element(by.id('login'))), 5000);
  1. Таймауты ожидания — возникает при слишком коротком browser.wait или медленной загрузке данных.
  2. Ошибки взаимодействия (ElementNotInteractableError) — элемент существует, но не готов к клику. Решение — проверка видимости и состояния элемента.

Метрики и CI интеграция

Для CI важно автоматически собирать метрики:

  • Процент успешных тестов — основной индикатор стабильности сборки.
  • Время выполнения — выявляет узкие места в сценариях тестирования.
  • История падений — помогает определить проблемные тесты или нестабильные элементы интерфейса.

Интеграция с Jenkins, GitLab CI или TeamCity позволяет автоматически публиковать отчёты HTML и XML, а также уведомлять команду о сбоях.


Практики структурированного анализа

  • Группировка по фичам или страницам — отчёты, разделённые по функциональности, ускоряют поиск причины падений.
  • Использование тегов (@smoke, @regression) — позволяет запускать только нужные тесты и анализировать отдельные группы.
  • Хранение скриншотов с временной меткой — упрощает корреляцию с логами CI и повторное тестирование проблемных сценариев.

Автоматическая трассировка ошибок

Современные подходы включают:

  • Сбор логов браузера через browser.manage().logs().get('browser').
  • Встроенные в HTML-отчёты логи JS-ошибок и предупреждений.
  • Возможность комбинировать скриншоты с логами для более точного восстановления сценариев падений.

Эти методы анализа обеспечивают прозрачность тестирования, позволяют быстро выявлять узкие места в приложении и поддерживают высокий уровень качества кода в Angular-проектах.