Интеграционное тестирование сервис-воркера

Workbox — это набор инструментов от Google для упрощения создания и управления сервис-воркерами, позволяющий реализовывать продвинутые стратегии кэширования, фоновую синхронизацию и управление офлайн-доступом. Интеграционное тестирование сервис-воркера предполагает проверку работы сервис-воркера в условиях, максимально приближенных к реальной среде: с сетевыми запросами, кэшем и жизненным циклом воркера.


Подготовка среды тестирования

Для интеграционного тестирования сервис-воркера необходимо:

  1. Изолированная среда браузера Использование чистого профиля браузера или инструментов типа Puppeteer или Playwright позволяет тестировать поведение сервис-воркера без влияния существующих кэшей и зарегистрированных воркеров.

  2. Эмуляция сетевых условий Инструменты браузерного API или Puppeteer позволяют симулировать медленное соединение, офлайн-режим и ошибки сервера, что критично для проверки стратегий кэширования Workbox.

  3. Контроль регистрации сервис-воркера Проверяется успешная регистрация и активация воркера, его жизненный цикл (install, activate, fetch), включая обработку событий message и sync.


Структура интеграционного теста

Тестирование сервис-воркера с Workbox обычно состоит из следующих этапов:

  1. Регистрация воркера Проверяется успешная регистрация и активация. В Puppeteer это выглядит как ожидание события navigator.serviceWorker.ready и проверка наличия воркера в navigator.serviceWorker.getRegistrations().

  2. Тестирование стратегий кэширования Workbox предоставляет несколько стратегий:

    • CacheFirst — сначала проверяется кэш, затем сеть.
    • NetworkFirst — сначала сеть, затем кэш.
    • StaleWhileRevalidate — отдача из кэша с параллельным обновлением.
    • CacheOnly / NetworkOnly — крайние варианты без fallback.

    Для каждого типа стратегии тест включает:

    • Проверку наличия ресурса в кэше после запроса.
    • Проверку обновления кэша при изменении ресурса на сервере.
    • Проверку обработки ошибок сети и fallback на кэш.
  3. Тестирование фоновой синхронизации и push-уведомлений Workbox поддерживает события sync и push. Интеграционные тесты проверяют:

    • Отложенную отправку данных при офлайн-режиме.
    • Корректное получение и отображение push-уведомлений.
    • Обработку ошибок при недоступности сервера.
  4. Валидация политики очистки кэша Workbox позволяет задавать правила очистки старых версий кэшей (maxEntries, maxAgeSeconds). Тесты включают:

    • Создание кэша с превышением лимита.
    • Проверку удаления устаревших или лишних ресурсов.
    • Верификацию, что текущие ресурсы остаются доступными.

Примеры подходов к тестированию

1. Проверка стратегии CacheFirst

const { chromium } = require('playwright');

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

  await page.goto('http://localhost:3000');
  await page.waitForServiceWorker();

  // Первый запрос — ресурс добавляется в кэш
  await page.reload();
  const cacheNames = await page.evaluate(async () => {
    const keys = await caches.keys();
    return keys;
  });

  console.assert(cacheNames.includes('my-cache-v1'), 'Кэш не создан');
  await browser.close();
})();

2. Проверка NetworkFirst с эмуляцией офлайн

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

Особенности интеграционного тестирования Workbox

  • Асинхронность событий сервис-воркера Все события (install, activate, fetch) происходят асинхронно. В тестах необходимо использовать ожидания (await, waitForEvent) для синхронизации.

  • Версионность кэша При обновлении воркера важно проверять не только наличие ресурса, но и его соответствие новой версии.

  • Изоляция от предыдущих тестов Каждый тест должен очищать кэш и deregister сервис-воркер, чтобы не было конфликта с предыдущими сценариями.

  • Тестирование стратегий динамического кэширования Для ресурсов, которые загружаются после первоначальной страницы, проверяется добавление и удаление кэша на лету.


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

  • Использовать Puppeteer или Playwright для контроля воркера в реальном браузере.
  • Применять workbox-window для упрощённого взаимодействия с сервис-воркером в тестах.
  • Организовывать тесты по стратегиям кэширования, отдельным типам ресурсов и событиям фоновой синхронизации.
  • Включать проверку обновления сервис-воркера при выпуске новой версии приложения.
  • Автоматизировать очистку кэша перед каждым тестом, чтобы исключить ложные срабатывания.

Заключение по методике тестирования

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