Сервис-воркеры представляют собой скрипты, работающие в фоновом режиме браузера, обеспечивая кэширование, офлайн-доступ, пуш-уведомления и оптимизацию сетевых запросов. Тестирование таких компонентов требует комплексного подхода, так как сервис-воркеры функционируют независимо от основного потока страницы. Основные задачи тестирования включают проверку корректности регистрации, работы кэширования, обновления ресурсов и обработки сетевых запросов.
Первый шаг — проверка успешной регистрации сервис-воркера. Это включает:
navigator.serviceWorker.register().install,
activate, statechange.Пример проверки регистрации в автоматизированном тесте:
navigator.serviceWorker.register('/sw.js')
.then(registration => {
if (!registration.active) {
throw new Error('Service worker не активен');
}
});
Важно учитывать, что сервис-воркеры могут оставаться в состоянии
waiting, пока не будут закрыты все страницы старой версии.
Автоматизированные тесты должны симулировать это поведение.
Workbox предоставляет готовые стратегии кэширования, которые необходимо тестировать в разных сценариях:
Cache First — сначала проверяется кэш, затем сеть. Тестирование должно включать:
expiration и
cacheName правила.Network First — сначала сеть, затем кэш. Особенности тестирования:
Stale While Revalidate — возвращает кэшированное содержимое сразу, одновременно обновляя его из сети. Тесты должны убедиться, что:
Пример конфигурации Workbox для Cache First:
workbox.routing.registerRoute(
({request}) => request.destination === 'image',
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({ maxEntries: 50 }),
],
})
);
Ключевой аспект — управление версиями кэшей:
install.activate.ExpirationPlugin, CacheableResponsePlugin)
для корректного удаления и обновления данных.Тестирование может включать автоматизированные проверки с помощью Puppeteer или Playwright, эмулирующих закрытие и повторное открытие вкладок, чтобы убедиться, что новые версии сервис-воркеров корректно активируются.
Сервис-воркеры работают как промежуточный слой между приложением и сетью. Тесты должны проверять:
Пример теста офлайн-доступа с использованием Puppeteer:
await page.setOfflineMode(true);
const response = await page.goto('/index.html');
const content = await page.content();
if (!content.includes('Основной контент')) {
throw new Error('Офлайн-доступ не работает');
}
Workbox поддерживает плагины для логирования:
Тестирование должно включать проверку, что ошибки сети или кэширования не приводят к падению приложения, а корректно обрабатываются и логируются.
Используются инструменты для имитации поведения браузера:
Примеры автоматизации:
Сервис-воркеры могут обрабатывать push-сообщения и синхронизацию данных в фоне. Тестирование включает:
push и sync.showNotification.Автоматизированные тесты часто используют моки браузерных API:
self.addEventListener('push', event => {
event.waitUntil(
self.registration.showNotification('Новое сообщение')
);
});
precacheManifest, должны быть проверены на актуальность и
доступность.Тесты должны моделировать все возможные состояния приложения, включая закрытие и повторное открытие вкладок, смену сети и наличие старых версий кэшей.