Глобальные настройки

Урок: Глобальные настройки и выполнение один раз на весь прогон в Playwright Test

Введение

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

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

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

  • глобальные настройки — задают общее поведение для всех тестов;
  • код, который выполняется один раз на весь прогон — подготавливает окружение заранее.

Если правильно их использовать, тесты становятся быстрее, чище и стабильнее.

Что значит «глобальные настройки»

Глобальные настройки — это такие параметры, которые автоматически применяются ко всем тестам без необходимости указывать их в каждом файле.

Часть таких настроек мы уже видели в конфигурации:

export default defineConfig({
  use: {
    baseURL: 'http://localhost:3000',
    headless: true,
  },
});

Здесь важно понять ключевую идею:

мы описываем поведение один раз, а используем везде.

Например, благодаря baseURL:

await page.goto('/');

Playwright сам подставит полный адрес. Тест не знает, какой именно URL используется — он просто следует глобальной настройке.

То же самое касается:

  • таймаутов;
  • режима браузера;
  • скриншотов;
  • trace;
  • viewport.

Это и есть глобальная конфигурация: единые правила для всех тестов.

Почему не стоит дублировать настройки в тестах

Посмотрим на два варианта.

Без глобальных настроек:

test('пример', async ({ page }) => {
  await page.goto('http://localhost:3000');
});

С глобальными настройками:

test('пример', async ({ page }) => {
  await page.goto('/');
});

Во втором случае:

  • тест короче;
  • меньше шансов ошибиться;
  • проще изменить адрес (в одном месте — в конфиге).

Теперь представь, что URL поменялся. В первом варианте тебе придется менять его во всех тестах. Во втором — только в конфигурации.

Именно поэтому глобальные настройки — это не просто удобство, а основа масштабируемости тестового проекта.

Когда нужен код «один раз на весь прогон»

Теперь другая ситуация.

Допустим, перед запуском тестов нужно:

  • создать тестового пользователя;
  • очистить базу данных;
  • залогиниться и сохранить состояние;
  • подготовить тестовые данные.

Если делать это внутри каждого теста — будет:

  • медленно;
  • дублирование кода;
  • больше нестабильности.

Логичнее сделать это один раз перед запуском всех тестов.

Для этого в Playwright есть механизм глобальной инициализации.

Глобальный setup (globalSetup)

Playwright позволяет выполнить специальный файл перед запуском всех тестов. Это называется globalSetup.

Пример конфигурации:

import { defineConfig } from '@playwright/test';

export default defineConfig({
  globalSetup: './global-setup.ts',
});

Теперь создадим сам файл:

// global-setup.ts
import { chromium } from '@playwright/test';

export default async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  await page.goto('http://localhost:3000/login');
  await page.fill('#username', 'test-user');
  await page.fill('#password', 'password');
  await page.click('button[type=submit]');

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

  await browser.close();
};

Разберем, что здесь происходит.

  1. Playwright перед запуском тестов выполняет этот файл.
  2. Мы открываем браузер вручную.
  3. Выполняем логин.
  4. Сохраняем состояние (cookies, localStorage).
  5. Закрываем браузер.

Этот код выполняется один раз на весь прогон.

Использование результата глобального setup

Теперь самое интересное — как использовать результат.

Добавим в конфигурацию:

export default defineConfig({
  use: {
    storageState: 'storageState.json',
  },
});

Что это значит?

Каждый тест теперь будет:

  • автоматически начинаться в уже залогиненном состоянии;
  • без необходимости повторять логин.

Пример теста:

test('проверка профиля', async ({ page }) => {
  await page.goto('/profile');
});

Здесь нет логина. Но пользователь уже авторизован.

Это мощный прием:

мы один раз делаем тяжелую операцию, а потом используем результат во всех тестах.

В чем разница между глобальными настройками и setup

Важно не путать два понятия.

Глобальные настройки — это параметры (например: URL, таймауты, браузер)

Глобальный setup — это код (например: логин, создание данных)

Проще запомнить так:

  • конфигурация описывает «как запускать»;
  • setup выполняет «что нужно подготовить».

Они работают вместе, но решают разные задачи.

Альтернатива: проекты и подготовка через них

Иногда вместо globalSetup используют проекты.

Например, можно сделать отдельный проект, который подготавливает состояние:

projects: [
  {
    name: 'setup',
    testMatch: /.*\.setup\.ts/,
  },
  {
    name: 'tests',
    dependencies: ['setup'],
  },
];

Это более гибкий способ, особенно в больших проектах. Но на старте проще использовать globalSetup.

Практический смысл

Теперь посмотрим на реальную пользу.

Без глобального setup:

  • каждый тест логинится;
  • тесты работают медленно;
  • больше сетевых запросов;
  • выше вероятность падений.

С глобальным setup:

  • логин выполняется один раз;
  • тесты становятся быстрее;
  • код тестов чище;
  • меньше нестабильности.

Глобальные настройки дают единые правила, а глобальный setup — готовое состояние.

Вместе они превращают тестовый проект из набора разрозненных сценариев в системный инструмент.

Итоговое понимание

Главная идея этой темы в том, что в тестах не должно быть лишнего повторения — ни в настройках, ни в подготовке данных.

Глобальные настройки позволяют один раз описать среду выполнения тестов и не дублировать ее в каждом файле.

Глобальный setup позволяет один раз подготовить состояние (например, логин или данные) и использовать его во всех тестах.

Если объединить эти два подхода, тесты становятся не только короче, но и более надежными. Ты перестаешь думать о технических деталях в каждом тесте и начинаешь сосредотачиваться на проверке поведения приложения — а это и есть главная цель автоматизации.