Когда автоматизированные тесты выполняются в CI/CD (Continuous Integration/Continuous Delivery) системе, одной из основных задач становится сокращение времени выполнения тестов. В условиях интенсивной разработки, каждое замедление процесса тестирования может затруднить скорость доставки изменений. Это особенно важно для проектов, где количество тестов большое, а изменения происходят часто.
Playwright позволяет запускать тесты параллельно, что значительно
сокращает время их выполнения. Для этого достаточно настроить
playwright-test с использованием параметра
workers, который позволяет разделить тесты между
несколькими процессами.
Пример настройки параллельного выполнения:
import { defineConfig } from '@playwright/test';
export default defineConfig({
workers: 4, // количество параллельных процессов
});
Параллельный запуск тестов — это один из самых мощных инструментов для сокращения времени работы тестов в CI. Однако, важно учитывать, что не все тесты могут быть запущены параллельно из-за зависимостей между ними. В таких случаях можно воспользоваться тегами и изолировать зависимые тесты от независимых.
Fixtures в Playwright — это мощный инструмент для управления состоянием между тестами. Они позволяют подготовить и очистить тестовое окружение, например, загрузить необходимые данные или настроить тестовый сервер. Использование fixtures позволяет избежать излишних повторений операций, таких как подготовка базы данных, настройка аутентификации и другие ресурсоёмкие операции.
Пример использования fixture для авторизации:
import { test, expect } from '@playwright/test';
test.describe('Сценарии с авторизацией', () => {
test.use({
storageState: 'state.json', // сохранение состояния между тестами
});
test('Тест с авторизацией', async ({ page }) => {
await page.goto('https://example.com');
// тестовая логика
});
});
В этом примере состояние страницы сохраняется в файл и затем используется повторно в других тестах, что позволяет избежать повторной авторизации и ускорить выполнение.
Одним из способов ускорить тесты является уменьшение времени ожидания в тестах. Playwright предоставляет механизмы, чтобы настроить тайм-ауты и ожидания для элементов страницы. Чрезмерно длинные задержки могут значительно увеличить время выполнения теста, особенно если они вызываются на каждом шаге. Оптимизация времени ожидания за счет использования кратких тайм-аутов и выбора элементов на странице через быстрые и эффективные селекторы может значительно ускорить работу тестов.
Пример использования тайм-аутов:
test('Тест с минимальными ожиданиями', async ({ page }) => {
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
const button = await page.waitForSelector('#submitButton', { timeout: 5000 });
await button.click();
});
Важно установить тайм-ауты таким образом, чтобы минимизировать время ожидания, но при этом не допускать пропуска нужных элементов.
Playwright по умолчанию работает в headless-режиме, когда браузер не отображает графический интерфейс. Этот режим не только ускоряет выполнение тестов, но и снижает потребление системных ресурсов. В некоторых случаях, например, при использовании в CI-системах, всегда стоит запускать тесты именно в headless-режиме.
Чтобы убедиться, что Playwright работает в headless-режиме, можно явно указать параметр:
import { chromium } from 'playwright';
const browser = await chromium.launch({ headless: true });
Такой запуск гарантирует, что тесты не будут тратить время на рендеринг графического интерфейса, что ускоряет процесс.
Предварительный прогрев — это процесс, при котором тестовое окружение подготавливается заранее. Это может включать кэширование ресурсов, таких как изображения или скрипты, что позволяет избежать повторной загрузки этих элементов во время тестов. Особенно полезным это будет при использовании серверов, которые могут задерживаться на старте из-за загрузки больших данных.
Playwright позволяет использовать локальные кэшированные файлы для ускорения загрузки страницы:
test('Тест с кешированием', async ({ page }) => {
await page.goto('https://example.com', { waitUntil: 'load' });
await page.route('**/*', route => route.continue({ cache: 'force-cache' }));
});
Этот подход сокращает время ожидания при загрузке страницы, особенно если страницы содержат множество ресурсов, которые могут быть закешированы для дальнейшего использования.
Для каждого теста Playwright создает новый браузерный контекст. Однако использование одного контекста для нескольких тестов может ускорить работу, поскольку не нужно повторно инициализировать браузер. Однако, стоит помнить, что если тесты не изолированы, это может привести к нежелательным побочным эффектам.
test('Оптимизация через один контекст', async ({ browser }) => {
const context = await browser.newContext();
const page = await context.newPage();
// выполнение тестов с одним контекстом
await page.goto('https://example.com');
});
Это уменьшает время, затрачиваемое на создание и уничтожение новых контекстов, ускоряя выполнение тестов.
Playwright предоставляет возможность эмулировать различные устройства и разрешения экранов. В CI-системах часто используются минимальные настройки для эмуляции устройств, что позволяет значительно ускорить выполнение тестов. Оптимизация эмуляции с использованием меньших разрешений или упрощенных устройств может значительно сократить время тестирования.
Пример эмуляции мобильного устройства с минимальным разрешением:
test('Тест с эмуляцией устройства', async ({ page }) => {
await page.emulate({
viewport: { width: 360, height: 640 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
});
await page.goto('https://example.com');
});
Использование минимальных параметров для эмуляции устройств позволяет ускорить процесс выполнения тестов и сократить время их выполнения.
Оптимизация времени выполнения тестов в CI-системах требует комплексного подхода, включающего параллельное выполнение, минимизацию ожиданий, использование кэширования и управление состоянием тестов. Playwright предоставляет мощные средства для эффективного тестирования, и правильная настройка этих инструментов может существенно улучшить скорость работы и качество тестов в рамках CI/CD пайплайнов.