Redis — это высокопроизводительное хранилище данных в памяти, часто используемое для кеширования. В контексте тестирования веб-приложений с Puppeteer его применение позволяет ускорять повторное выполнение сценариев, хранить промежуточные данные и управлять состоянием сессий без постоянного обращения к базе данных или внешним API.
Для работы с Redis требуется его установка на локальной машине или использование Docker-контейнера:
sudo apt-get install redis-server
# Запуск Redis
redis-server
# Проверка работы
redis-cli ping
# Ответ: PONG
Для Node.js необходим клиент Redis. Наиболее популярный —
ioredis:
npm install ioredis
Инициализация клиента в проекте:
const Redis = require('ioredis');
const redis = new Redis(); // по умолчанию подключается к localhost:6379
1. Кеширование страниц и элементов
При тестировании Puppeteer часто возникает необходимость многократно загружать одни и те же страницы. С помощью Redis можно сохранять HTML или содержимое элементов для последующего использования:
const puppeteer = require('puppeteer');
async function fetchPage(url) {
const cached = await redis.get(url);
if (cached) return cached;
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
const content = await page.content();
await redis.set(url, content, 'EX', 3600); // кеш на 1 час
await browser.close();
return content;
}
Особенности:
EX для автоматического истечения срока
действия.
2. Кеширование API-запросов
Веб-приложения активно используют API. Для сокращения времени тестирования и снижения нагрузки на серверы можно кешировать ответы API:
async function fetchAPI(url) {
const cached = await redis.get(url);
if (cached) return JSON.parse(cached);
const response = await fetch(url);
const data = await response.json();
await redis.set(url, JSON.stringify(data), 'EX', 300); // кеш на 5 минут
return data;
}
Преимущества:
При тестировании сайтов с аутентификацией повторное прохождение логина занимает время. Redis позволяет хранить сессионные токены или cookies:
async function saveCookies(page, userId) {
const cookies = await page.cookies();
await redis.set(`cookies:${userId}`, JSON.stringify(cookies), 'EX', 3600);
}
async function loadCookies(page, userId) {
const cached = await redis.get(`cookies:${userId}`);
if (!cached) return;
const cookies = JSON.parse(cached);
await page.setCookie(...cookies);
}
Особенности:
Time-to-live (TTL) Ключи всегда должны иметь срок жизни, чтобы избежать накопления устаревших данных.
Инвалидация по событию В сложных приложениях кеш можно очищать при обновлении контента на сервере.
Хранение в виде JSON Сложные объекты удобно
сериализовать через JSON.stringify и десериализовать через
JSON.parse.
Разделение ключей по типам данных Например:
page:<url>, api:<endpoint>,
session:<userId> — это упрощает поиск и удаление.
Redis особенно полезен в автоматизированных пайплайнах:
Пример использования в Jest с Puppeteer:
describe('Тесты с кешированием', () => {
let browser;
let page;
beforeAll(async () => {
browser = await puppeteer.launch();
page = await browser.newPage();
await loadCookies(page, 'testUser');
});
afterAll(async () => {
await browser.close();
});
test('Загрузка страницы с кешем', async () => {
const content = await fetchPage('https://example.com');
expect(content).toContain('Example Domain');
await saveCookies(page, 'testUser');
});
});
Redis предоставляет встроенные команды для мониторинга использования кеша:
redis-cli info memory
redis-cli keys '*'
redis-cli ttl <key>
В тестировании важно следить за:
Эти данные позволяют оптимизировать стратегию кеширования и предотвращать утечки памяти в долгих тестовых сессиях.
Эффективное использование Redis в связке с Puppeteer позволяет ускорить тестирование, снизить нагрузку на ресурсы и сделать сценарии более стабильными и предсказуемыми.