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

Структурированное логирование является важным инструментом при автоматизированном тестировании с использованием Playwright на JavaScript. Оно позволяет собирать подробную информацию о выполнении тестов, легко фильтровать события и интегрировать логи с системами мониторинга и анализа.

Принципы структурированного логирования

1. Форматирование логов: Логи представляются в формате JSON, где каждая запись содержит одинаковую структуру полей. Основные поля включают:

  • timestamp — время события в формате ISO 8601.
  • level — уровень логирования (info, warn, error, debug).
  • message — краткое описание события.
  • context — объект с дополнительными данными (например, URL страницы, селекторы, результаты действий).

Пример JSON-записи:

{
  "timestamp": "2026-01-09T12:30:45.123Z",
  "level": "info",
  "message": "Страница загружена успешно",
  "context": {
    "url": "https://example.com",
    "responseStatus": 200
  }
}

2. Разделение логов по уровням:

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

Настройка логирования в Playwright

Playwright не предоставляет встроенного структурированного логирования для тестов, но его легко реализовать через стандартные возможности JavaScript и внешние библиотеки, например pino или winston.

Пример использования pino:

import { test } from '@playwright/test';
import pino from 'pino';

const logger = pino({
  level: 'debug',
  formatters: {
    level(label) {
      return { level: label };
    }
  },
  timestamp: pino.stdTimeFunctions.isoTime
});

test('Пример структурированного логирования', async ({ page }) => {
  logger.info({ message: 'Начало теста', context: { testName: 'Пример теста' } });
  
  await page.goto('https://example.com');
  logger.info({ message: 'Страница открыта', context: { url: page.url() } });

  const title = await page.title();
  logger.debug({ message: 'Заголовок страницы', context: { title } });

  if (title !== 'Example Domain') {
    logger.error({ message: 'Заголовок не соответствует', context: { expected: 'Example Domain', actual: title } });
  }

  logger.info({ message: 'Тест завершен', context: { testName: 'Пример теста' } });
});

Логирование событий браузера

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

  • console — вывод консоли в браузере.
  • request — отправка HTTP-запросов.
  • response — получение HTTP-ответов.
  • pageerror — ошибки JavaScript на странице.

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

page.on('request', request => {
  logger.info({ message: 'Отправлен запрос', context: { url: request.url(), method: request.method() } });
});

page.on('response', response => {
  logger.info({
    message: 'Получен ответ',
    context: { url: response.url(), status: response.status() }
  });
});

Внедрение контекста теста

Структурированные логи становятся особенно полезными, если включить в них контекст теста, такой как:

  • имя теста, описание шагов, уникальные идентификаторы.
  • параметры теста (например, данные из таблиц или CSV).
  • состояние страницы или данных после выполнения действий.

Пример использования контекста:

logger.info({
  message: 'Проверка элемента',
  context: {
    testName: 'Проверка кнопки Submit',
    selector: '#submit',
    exists: await page.isVisible('#submit')
  }
});

Интеграция с CI/CD и системами мониторинга

Структурированные JSON-логи легко интегрируются с внешними системами:

  • ELK Stack (Elasticsearch, Logstash, Kibana) — для агрегации и визуализации логов.
  • Grafana Loki — для анализа потоков логов.
  • Sentry — для отслеживания ошибок тестов и браузерных событий.

Принцип прост: каждый тест пишет логи в файл JSON или поток stdout, после чего CI/CD собирает их для анализа.

Советы по организации логов

  • Все шаги теста логируются последовательно, чтобы можно было воспроизвести цепочку действий.
  • Ключевые события (например, переходы между страницами, клики, проверки) выделяются отдельными уровнями (info или debug).
  • Ошибки логируются с максимально возможным контекстом: селекторы, данные формы, URL, стек вызовов.
  • Для длительных тестов можно разбивать логи по сессиям или по тестовым сценариям, чтобы ускорить поиск причин сбоев.

Структурированное логирование позволяет не только фиксировать события тестирования, но и превращает их в аналитический инструмент для улучшения стабильности автоматизации и понимания поведения приложения.