Профилирование тестов в Protractor позволяет измерять время выполнения отдельных сценариев, выявлять узкие места в автотестах и оптимизировать работу с браузером. Основная цель — повысить эффективность тестирования и ускорить обратную связь при проверке веб-приложений.
Важнейшие показатели, которые фиксируются при профилировании:
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 поддерживает хуки onPrepare,
beforeEach и afterEach, которые позволяют
централизованно собирать статистику:
Пример:
let startTime;
beforeEach(() => {
startTime = new Date().getTime();
});
afterEach(() => {
const duration = new Date().getTime() - startTime;
console.log(`Время выполнения теста: ${duration} мс`);
});
Для более структурированной аналитики применяются 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');
});
Это позволяет строить графики времени выполнения, выявлять деградацию производительности тестов после изменений в коде и оптимизировать сценарии.
Профилирование тестов в Protractor позволяет не только ускорить тестирование, но и выявить слабые места в веб-приложении, которые могут негативно влиять на пользовательский опыт.