Кеширование и переиспользование

В тестировании веб-приложений важно не только проверять функциональность, но и обеспечивать высокую производительность тестов. Это можно достичь с помощью кеширования и переиспользования ресурсов. В Playwright есть несколько способов повысить скорость выполнения тестов, избегая ненужных операций и повторных запросов. Рассмотрим, как кеширование и переиспользование могут быть реализованы с использованием этого инструмента.

Кеширование данных

Одной из основных проблем в автоматизации тестов является необходимость многократно загружать одни и те же страницы или выполнять одинаковые запросы, что замедляет работу тестов. В Playwright можно эффективно кешировать данные для того, чтобы избежать повторных обращений к серверу, например, при загрузке страниц, изображений, или выполнения долгих операций, таких как аутентификация.

Кеширование сессий

Playwright позволяет сохранять и переиспользовать сессии, что особенно полезно при тестировании страниц, требующих авторизации. Вместо того чтобы повторно вводить данные для входа в каждый тест, можно сохранить состояние сессии (куки, локальное хранилище) и переиспользовать его в других тестах. Для этого можно использовать метод browserContext.storageState().

Пример кеширования сессии:

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

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

  // Вход в систему и сохранение состояния
  await page.goto('https://example.com/login');
  await page.fill('input[name="username"]', 'user');
  await page.fill('input[name="password"]', 'password');
  await page.click('button[type="submit"]');
  await page.waitForSelector('#dashboard'); // Дождаться загрузки страницы

  // Сохранение состояния
  await context.storageState({ path: 'state.json' });

  await browser.close();
})();

В следующем тесте можно использовать сохранённое состояние для быстрого доступа:

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    storageState: 'state.json'
  });
  const page = await context.newPage();

  // Переход на защищённую страницу без повторной авторизации
  await page.goto('https://example.com/dashboard');
  await page.waitForSelector('#dashboard'); // Проверка, что страница загружена

  await browser.close();
})();

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

Другим методом кеширования является сохранение ответов от сервера. Например, для того чтобы не загружать данные с сервера каждый раз, можно записать ответы API в файл и затем использовать их при повторных запусках тестов. Это полезно, если нужно тестировать, как приложение работает с определёнными данными.

Для этого Playwright позволяет перехватывать сетевые запросы с помощью page.route(). Ответы на эти запросы можно кешировать и использовать повторно.

Пример кеширования запросов:

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

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

  await page.route('**/api/data', (route) => {
    // Если файл с кешом существует, используем его
    if (fs.existsSync('cachedData.json')) {
      const data = JSON.parse(fs.readFileSync('cachedData.json', 'utf8'));
      route.fulfill({
        status: 200,
        contentType: 'application/json',
        body: JSON.stringify(data),
      });
    } else {
      route.continue();
    }
  });

  // Запрос данных
  const response = await page.goto('https://example.com');
  const data = await response.json();

  // Сохраняем ответ в файл для кеширования
  fs.writeFileSync('cachedData.json', JSON.stringify(data));

  await browser.close();
})();

Переиспользование данных и объектов

Переиспользование объектов, таких как страницы и контексты браузеров, играет ключевую роль в сокращении времени выполнения тестов. В Playwright можно использовать объекты браузера и контексты для переиспользования уже созданных сессий, а также для уменьшения числа перезапусков браузера между тестами.

Переиспользование страниц

Создание новой страницы в Playwright обычно требует дополнительных ресурсов, поскольку каждый новый объект связан с процессом рендеринга и загрузкой страницы. Для ускорения тестов можно повторно использовать одну и ту же страницу, если она не изменяется между тестами.

Пример переиспользования страницы:

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

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

  // Первый тест
  await page.goto('https://example.com/page1');
  // Выполнение действий на странице

  // Второй тест
  await page.goto('https://example.com/page2');
  // Выполнение действий на другой странице

  await browser.close();
})();

Переиспользование контекстов браузеров

Вместо того чтобы открывать новый контекст для каждого теста, можно переиспользовать один контекст для нескольких тестов, что позволяет снизить накладные расходы на создание и уничтожение контекстов. Это может быть полезно, когда нужно протестировать несколько разных страниц или сценариев с одинаковыми настройками (например, с сохранённым состоянием сессии).

Пример переиспользования контекста:

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

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

  // Первый тест
  const page1 = await context.newPage();
  await page1.goto('https://example.com/page1');
  await page1.close();

  // Второй тест
  const page2 = await context.newPage();
  await page2.goto('https://example.com/page2');
  await page2.close();

  await browser.close();
})();

Сетевые настройки и кеширование

Другим способом оптимизации тестов является настройка кеширования на уровне сетевых запросов. С помощью Playwright можно изменить настройки кеширования или отключить кеширование для определённых запросов, чтобы проверить поведение приложения при различных условиях.

Отключение кеша

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

Пример отключения кеша:

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

(async () => {
  const browser = await chromium.launch();
  const context = await browser.newContext({
    bypassCSP: true, // Отключение CSP
    userAgent: 'Custom User-Agent',
    acceptDownloads: true,
  });

  // Отключение кеша
  await context.addInitScript(() => {
    window.localStorage.clear();
    window.sessionStorage.clear();
    navigator.storage.estimate = () => Promise.resolve({ quota: 0, usage: 0 });
  });

  const page = await context.newPage();
  await page.goto('https://example.com');
  await browser.close();
})();

Заключение

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