Кеширование зависимостей

Кеширование зависимостей является критически важной практикой при автоматизированном тестировании с использованием Puppeteer. Оно позволяет ускорить запуск тестов, снизить нагрузку на сеть и гарантировать стабильность окружения. Puppeteer, являясь библиотекой для управления браузером Chromium или Chrome через протокол DevTools, имеет ряд особенностей, которые делают грамотное кеширование особенно полезным.


Кеш браузера и пользовательские данные

При каждом запуске Puppeteer по умолчанию создаёт временный профиль пользователя. Это означает, что все настройки, куки и кеши загружаются заново. Для уменьшения времени старта и повторного скачивания ресурсов можно использовать persistent context:

const puppeteer = require(&

(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        userDataDir: './user_data'
    });
    const page = await browser.newPage();
    await page.goto('https://example.com');
})();

Пояснение ключевых моментов:

  • userDataDir указывает директорию, где будут храниться все данные браузера: куки, локальное хранилище, кеш.
  • При последующих запусках браузер будет использовать уже существующий профиль, что позволяет избежать повторной загрузки статических ресурсов.

Кеширование сетевых запросов

Puppeteer предоставляет возможности для интерсепта сетевых запросов с целью их кеширования или повторного использования. Для этого используется метод page.setRequestInterception(true):

await page.setRequestInterception(true);

page.on('request', request => {
    if (request.resourceType() === 'image') {
        request.respond({
            status: 200,
            contentType: 'image/png',
            body: '' // можно подставить закешированные данные
        });
    } else {
        request.continue();
    }
});

Особенности подхода:

  • Позволяет подменять медленные ресурсы локальными копиями.
  • Снижает зависимость от внешних серверов при повторных тестах.
  • Можно кешировать JSON-ответы API для ускорения тестов, особенно при интеграционном тестировании.

Кеширование npm-зависимостей Puppeteer

Puppeteer распространяется через npm и автоматически скачивает Chromium при установке. Для больших CI/CD-пайплайнов повторная загрузка браузера может стать узким местом. Оптимизация возможна через:

  1. Использование переменной окружения PUPPETEER_SKIP_CHROMIUM_DOWNLOAD При установке:

    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm install puppeteer

    Позволяет пропустить скачивание Chromium и использовать уже существующий браузер.

  2. Настройка PUPPETEER_EXECUTABLE_PATH Указывает путь к локально установленному браузеру:

    const browser = await puppeteer.launch({
        executablePath: '/usr/bin/chromium-browser'
    });

Эти подходы экономят сетевой трафик и ускоряют сборку тестового окружения.


Слои кеширования в CI/CD

В системах непрерывной интеграции критически важно разделять кеши:

  1. Кеш npm-зависимостей Большинство CI-систем (GitHub Actions, GitLab CI) поддерживают кеширование каталога node_modules или папки с пакетами npm (~/.npm). Это снижает время установки Puppeteer и его зависимостей.

  2. Кеш браузера Сохранение папки с загруженным Chromium (.local-chromium) позволяет использовать один и тот же бинарник в разных сборках.

  3. Кеш тестовых данных и сетевых ресурсов Можно сохранять JSON-ответы API, статические изображения и другие ресурсы, чтобы повторно не загружать их с внешних серверов.


Практическая схема кеширования

Эффективное кеширование в Puppeteer тестировании обычно строится на следующих принципах:

  • Разделение слоёв кеша: отдельно npm, отдельно бинарники браузера, отдельно тестовые данные.
  • Использование persistent context: сохранение пользовательских данных браузера для ускорения повторных тестов.
  • Интерсепт запросов: подмена ресурсов на закешированные версии для снижения сетевых задержек.
  • Контроль версий кеша: привязка кеша к версии Puppeteer и браузера для предотвращения несовместимости.

Метрики эффективности кеширования

Для оценки влияния кеширования на тесты учитываются:

  • Время запуска браузера: сокращается при использовании userDataDir.
  • Время загрузки страниц: снижается при интерсепте и повторном использовании закешированных ресурсов.
  • Пропускные способности CI/CD: меньше трафика и ускоренные сборки.

Эти метрики помогают обосновать необходимость кеширования в проектах с большим количеством автоматизированных тестов.


Дополнительные инструменты и практики

  • Puppeteer Cluster: позволяет одновременно запускать несколько браузерных процессов с общим кешем.
  • Local HTTP Proxy: можно настроить прокси для кеширования API и статических файлов.
  • Service Worker Cache: для эмуляции кеширования браузера на уровне приложения.

Использование этих инструментов позволяет минимизировать время выполнения тестов и сделать тестовое окружение более предсказуемым.