Интеграция с logging библиотеками

Эффективное логирование тестов является ключевым элементом для поддержки, отладки и анализа автоматизированных сценариев. Playwright предоставляет базовые возможности для отслеживания действий, однако интеграция с полноценными logging библиотеками позволяет создавать структурированные, настраиваемые и легко анализируемые логи.


Подключение и настройка logging библиотеки

Наиболее популярные библиотеки для логирования в JavaScript — winston и pino. Они обеспечивают поддержку различных уровней логирования (info, warn, error, debug), форматирование сообщений, вывод в файлы и потоковую передачу в консоль.

Пример настройки winston:

const { createLogger, format, transports } = require('winston');

const logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
        format.printf(({ timestamp, level, message }) => `${timestamp} [${level.toUpperCase()}]: ${message}`)
    ),
    transports: [
        new transports.Console(),
        new transports.File({ filename: 'test-execution.log' })
    ]
});

module.exports = logger;

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

  • level — минимальный уровень логирования, который будет выводиться.
  • format — комбинирует метку времени и формат строки для читаемости.
  • transports — определяет, куда будут направляться логи: консоль, файлы или внешние сервисы.

Логирование действий Playwright

Playwright предоставляет события и методы для отслеживания навигации, запросов, ошибок и действий пользователя. Интеграция с logging библиотекой позволяет фиксировать эти события с настраиваемым уровнем детализации.

Пример логирования навигации и кликов:

const { chromium } = require('playwright');
const logger = require('./logger');

(async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();

    page.on('request', request => {
        logger.info(`Запрос: ${request.method()} ${request.url()}`);
    });

    page.on('response', response => {
        logger.info(`Ответ: ${response.status()} ${response.url()}`);
    });

    await page.goto('https://example.com');
    logger.info('Страница загружена');

    await page.click('text=More information');
    logger.info('Клик по ссылке "More information" выполнен');

    await browser.close();
})();

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

  • Использование событий request и response позволяет отслеживать сетевую активность.
  • Встроенные логи действий (goto, click, fill) помогают отследить ход теста.
  • С логами можно связывать ошибки и создавать полные отчеты о прохождении тестов.

Уровни логирования и фильтрация

Библиотеки вроде winston и pino поддерживают разные уровни логов:

  • error — критические ошибки.
  • warn — предупреждения.
  • info — общая информация о выполнении теста.
  • debug — детальные сообщения для отладки.

Пример условного логирования действий в зависимости от уровня:

if (process.env.LOG_LEVEL === 'debug') {
    logger.debug(`Элемент найден: ${await page.locator('#submit').count()} экземпляров`);
} else {
    logger.info('Элемент #submit проверен');
}

Структурированные логи

Для интеграции с аналитикой и внешними системами полезно использовать структурированные форматы, например JSON. Это упрощает парсинг логов и построение отчетов.

Пример конфигурации winston для JSON:

const logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp(),
        format.json()
    ),
    transports: [
        new transports.File({ filename: 'structured-log.json' })
    ]
});

Логи в таком формате можно отправлять в системы мониторинга, такие как ELK Stack или Grafana Loki.


Интеграция с фреймворками тестирования

Playwright часто используется вместе с Jest, Mocha или Playwright Test Runner. Логирование можно интегрировать на уровне хуков:

const { test } = require('@playwright/test');
const logger = require('./logger');

test.beforeEach(async ({ page }) => {
    logger.info(`Начало теста: ${test.info().title}`);
});

test.afterEach(async ({ page }) => {
    logger.info(`Окончание теста: ${test.info().title}`);
});

test('Пример теста', async ({ page }) => {
    await page.goto('https://example.com');
    logger.info('Открыта главная страница');
});

Преимущества подхода:

  • Унификация логов для всех тестов.
  • Возможность автоматически логировать ошибки и скриншоты.
  • Разделение информации по уровням важности.

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

Playwright генерирует ошибки при недоступности элементов или тайм-аутах. Интеграция с logging библиотекой позволяет фиксировать полное состояние страницы при ошибках:

try {
    await page.click('#non-existent');
} catch (error) {
    logger.error(`Ошибка клика: ${error.message}`);
    await page.screenshot({ path: 'error-screenshot.png' });
    logger.info('Скриншот ошибки сохранён');
}

Ключевые моменты:

  • Фиксация ошибок и контекста теста упрощает диагностику.
  • Сочетание логов и скриншотов даёт полную картину выполнения сценария.
  • Можно расширять логирование для записи состояния DOM или сетевых запросов в момент ошибки.

Best practices

  1. Централизованный логгер — создается один экземпляр логгера и используется во всех тестах.
  2. Разделение уровней логов — ошибки, предупреждения и информационные сообщения должны быть легко различимы.
  3. Структурированные форматы — JSON или XML позволяют интегрировать данные с системами мониторинга.
  4. Логирование событий Playwright — полезно для аудита и анализа нестандартного поведения страницы.
  5. Интеграция с CI/CD — логи должны быть доступны в отчётах сборки для упрощения анализа неудачных тестов.

Использование logging библиотек совместно с Playwright обеспечивает прозрачность тестирования, упрощает отладку и позволяет формировать масштабируемые отчёты о выполнении автоматизированных сценариев.