Профилирование тестов

Профилирование тестов в Protractor позволяет измерять время выполнения отдельных сценариев, выявлять узкие места в автотестах и оптимизировать работу с браузером. Основная цель — повысить эффективность тестирования и ускорить обратную связь при проверке веб-приложений.

Метрики времени выполнения

Важнейшие показатели, которые фиксируются при профилировании:

  • Время старта браузера — измеряется с момента инициализации Protractor до полной готовности страницы к взаимодействию.
  • Время выполнения сценариев (specs) — сколько времени уходит на отдельный тестовый сценарий.
  • Время выполнения отдельных шагов (steps) — позволяет выявить медленные операции, например, загрузку элементов через element(by.css(...)) или browser.wait(...).

Для сбора этих метрик можно использовать встроенные функции Node.js, например, console.time() и console.timeEnd():

describe('Профилирование примера', () => {
    it('Должно измерять время загрузки страницы', async () => {
        console.time('Загрузка главной страницы');
        await browser.get('https://example.com');
        console.timeEnd('Загрузка главной страницы');
    });
});

Использование Protractor Hooks для профилирования

Protractor поддерживает хуки onPrepare, beforeEach и afterEach, которые позволяют централизованно собирать статистику:

  • onPrepare — выполняется один раз перед запуском всех тестов. Можно инициализировать логирование и хранение данных о времени выполнения.
  • beforeEach — фиксирует старт каждого сценария.
  • afterEach — фиксирует окончание сценария и вычисляет разницу времени.

Пример:

let startTime;

beforeEach(() => {
    startTime = new Date().getTime();
});

afterEach(() => {
    const duration = new Date().getTime() - startTime;
    console.log(`Время выполнения теста: ${duration} мс`);
});

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

Для более структурированной аналитики применяются Jasmine Reporters, такие как jasmine-spec-reporter и jasmine-reporters. Они поддерживают логирование времени выполнения тестов и формирование отчётов:

const JasmineSpecReporter = require('jasmine-spec-reporter').SpecReporter;

exports.config = {
    onPrepare: () => {
        jasmine.getEnv().addReporter(new JasmineSpecReporter({
            spec: { displayDuration: true }
        }));
    }
};

displayDuration: true позволяет отображать время выполнения каждого теста прямо в консоли, что облегчает обнаружение медленных сценариев.

Профилирование асинхронных операций

Protractor работает с асинхронными действиями через async/await. Для точного измерения времени важно учитывать не только основной тест, но и все асинхронные операции, включая ожидания элементов:

it('Измеряет время ожидания элемента', async () => {
    const start = Date.now();
    const elem = element(by.css('.dynamic-content'));
    await browser.wait(protractor.ExpectedConditions.visibilityOf(elem), 5000);
    console.log(`Время ожидания элемента: ${Date.now() - start} мс`);
});

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

Для глубокого профилирования полезно использовать Chrome DevTools Protocol (CDP) через browser.driver.sendChromiumCommand. Это позволяет собирать CPU и memory профили прямо из тестов:

await browser.driver.sendChromiumCommand('Profiler.enable', {});
await browser.driver.sendChromiumCommand('Profiler.start', {});

// Выполнение теста
await browser.get('https://example.com');

const profile = await browser.driver.sendChromiumCommand('Profiler.stop', {});
console.log('CPU профиль собран:', profile);

Такой подход помогает не только измерять время тестов, но и находить участки приложения, создающие нагрузку на браузер.

Автоматизация сбора статистики

Для больших проектов рекомендуется сохранять результаты профилирования в JSON или CSV для последующего анализа:

const fs = require('fs');

afterEach(() => {
    const duration = new Date().getTime() - startTime;
    const log = { test: jasmine.currentTest.description, duration };
    fs.appendFileSync('profiling.json', JSON.stringify(log) + '\n');
});

Это позволяет строить графики времени выполнения, выявлять деградацию производительности тестов после изменений в коде и оптимизировать сценарии.

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

  • Измерять не только общий тайминг тестов, но и ключевые шаги сценария, особенно асинхронные операции и загрузку страниц.
  • Использовать hooks Protractor для централизованного логирования времени.
  • Интегрировать профилирование с существующими Jasmine Reporters для удобного отображения данных.
  • В крупных проектах хранить статистику в структурированных файлах и периодически анализировать тенденции.
  • Применять CDP команды для выявления проблем производительности браузера, которые напрямую влияют на скорость автотестов.

Профилирование тестов в Protractor позволяет не только ускорить тестирование, но и выявить слабые места в веб-приложении, которые могут негативно влиять на пользовательский опыт.