Workbox — это набор инструментов от Google для упрощения создания и управления сервис-воркерами, позволяющий реализовывать продвинутые стратегии кэширования, фоновую синхронизацию и управление офлайн-доступом. Интеграционное тестирование сервис-воркера предполагает проверку работы сервис-воркера в условиях, максимально приближенных к реальной среде: с сетевыми запросами, кэшем и жизненным циклом воркера.
Для интеграционного тестирования сервис-воркера необходимо:
Изолированная среда браузера Использование чистого профиля браузера или инструментов типа Puppeteer или Playwright позволяет тестировать поведение сервис-воркера без влияния существующих кэшей и зарегистрированных воркеров.
Эмуляция сетевых условий Инструменты браузерного API или Puppeteer позволяют симулировать медленное соединение, офлайн-режим и ошибки сервера, что критично для проверки стратегий кэширования Workbox.
Контроль регистрации сервис-воркера Проверяется
успешная регистрация и активация воркера, его жизненный цикл
(install, activate, fetch),
включая обработку событий message и
sync.
Тестирование сервис-воркера с Workbox обычно состоит из следующих этапов:
Регистрация воркера Проверяется успешная
регистрация и активация. В Puppeteer это выглядит как ожидание события
navigator.serviceWorker.ready и проверка наличия воркера в
navigator.serviceWorker.getRegistrations().
Тестирование стратегий кэширования Workbox предоставляет несколько стратегий:
Для каждого типа стратегии тест включает:
Тестирование фоновой синхронизации и
push-уведомлений Workbox поддерживает события sync
и push. Интеграционные тесты проверяют:
Валидация политики очистки кэша Workbox
позволяет задавать правила очистки старых версий кэшей
(maxEntries, maxAgeSeconds). Тесты
включают:
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();
})();
Асинхронность событий сервис-воркера Все события
(install, activate, fetch)
происходят асинхронно. В тестах необходимо использовать ожидания
(await, waitForEvent) для
синхронизации.
Версионность кэша При обновлении воркера важно проверять не только наличие ресурса, но и его соответствие новой версии.
Изоляция от предыдущих тестов Каждый тест должен очищать кэш и deregister сервис-воркер, чтобы не было конфликта с предыдущими сценариями.
Тестирование стратегий динамического кэширования Для ресурсов, которые загружаются после первоначальной страницы, проверяется добавление и удаление кэша на лету.
workbox-window для упрощённого взаимодействия
с сервис-воркером в тестах.Интеграционное тестирование сервис-воркера с Workbox позволяет не только проверить корректность кэширования и работы стратегии, но и убедиться в устойчивости приложения при изменении сети, обновлении версий и работе офлайн. Основной акцент делается на тестирование взаимодействия сервис-воркера с браузером, сетью и кэшем, а также на проверку жизненного цикла воркера и его событий.