Глобальная настройка и очистка
Введение
Настроить глобальную настройку и очистку можно двумя способами: с помощью файла глобальной настройки и указания параметра в конфигурации в разделе globalSetup либо с помощью зависимостей проектов. При использовании зависимостей проектов вы определяете проект, который запускается до всех остальных проектов. Это рекомендуемый подход, так как он лучше интегрируется с тестовым раннером Playwright: глобальная настройка появится в HTML-отчёте, будут записываться трассировки, а также можно будет использовать фикстуры. Подробное сравнение двух подходов приведено в таблице ниже.
| Возможность | Зависимости проектов (рекомендуется) |
globalSetup (параметр конфигурации) |
|---|---|---|
| Выполняется до всех тестов | ✅ Да | ✅ Да |
| Отображение в HTML-отчёте | ✅ Отображается как отдельный проект | ❌ Не отображается |
| Запись трассировки | ✅ Доступна полная трассировка | ❌ Не поддерживается |
| Фикстуры Playwright | ✅ Полностью поддерживаются | ❌ Не поддерживаются |
| Управление браузером | ✅ С помощью фикстуры browser |
❌ Полностью вручную с помощью browserType.launch()
|
| Параллельное выполнение и повторные попытки | ✅ Поддерживаются стандартной конфигурацией | ❌ Не применимо |
Параметры конфигурации, такие как headless или testIdAttribute
|
✅ Применяются автоматически | ❌ Игнорируются |
Вариант 1: Зависимости проектов
Зависимости проектов — это список проектов, которые должны быть запущены до начала тестов в другом проекте. Они могут быть полезны для настройки действий глобальной настройки, чтобы один проект зависел от предварительного запуска другого. Использование зависимостей позволяет глобальной настройке создавать трассировки и другие артефакты.
Настройка
Сначала добавим новый проект с именем 'setup db'. Затем зададим ему свойство testProject.testMatch, чтобы оно соответствовало файлу с именем global.setup.ts:
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
},
// {
// other project
// }
]
}); Затем добавим свойство testProject.dependencies в проекты, зависящие от проекта настройки, и передадим в массив имя проекта-зависимости, определённое на предыдущем шаге:
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
},
{
name: 'chromium with db',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
}); В этом примере проект 'chromium with db' зависит от проекта 'setup db'. Затем создадим тест настройки, расположенный в корневом каталоге проекта (обратите внимание: код настройки и очистки должен быть определён как обычный тест с помощью вызова функции test()):
import { test as setup } from '@playwright/test';
setup('create new database', async ({ }) => {
console.log('creating new database...');
// Initialize the database
}); import { test, expect } from '@playwright/test';
test('menu', async ({ page }) => {
// Your test that depends on the database
}); Очистка
Чтобы выполнить очистку после настройки, добавьте свойство testProject.teardown в проект настройки. Оно будет выполнено после запуска всех зависимых проектов.
Сначала добавим в проект настройки свойство testProject.teardown со значением 'cleanup db' — именем, которое мы присвоили проекту очистки на предыдущем шаге:
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
// ...
projects: [
{
name: 'setup db',
testMatch: /global\.setup\.ts/,
teardown: 'cleanup db',
},
{
name: 'cleanup db',
testMatch: /global\.teardown\.ts/,
},
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup db'],
},
]
}); Затем создадим файл global.teardown.ts в каталоге тестов проекта. Он будет использоваться для удаления данных из базы данных после выполнения всех тестов.
import { test as teardown } from '@playwright/test';
teardown('delete database', async ({ }) => {
console.log('deleting test database...');
// Delete the database
}); Фильтрация тестов
Все параметры фильтрации тестов, такие как --grep/--grep-invert, --shard, фильтрация непосредственно по расположению в командной строке или использование test.only(), напрямую выбирают основные тесты для запуска. Если эти тесты принадлежат проекту с зависимостями, также будут запущены все тесты из этих зависимостей.
Можно передать параметр командной строки --no-deps, чтобы пропустить все зависимости и этапы очистки. Будут запущены только выбранные вами напрямую проекты.
Другие примеры
Более подробные примеры см. в следующих материалах:
- руководство по аутентификации
- публикация в блоге Улучшенная глобальная настройка в Playwright: повторное использование входа с помощью зависимостей проектов
- видео о выпуске v1.31 с демонстрацией
Вариант 2: Настройка globalSetup и globalTeardown
Можно использовать параметр globalSetup в файле конфигурации, чтобы выполнить настройку один раз перед запуском всех тестов. Файл глобальной настройки должен экспортировать одну функцию, принимающую объект конфигурации. Эта функция будет выполнена один раз перед всеми тестами.
Аналогичным образом используйте globalTeardown, чтобы выполнить действие один раз после всех тестов. Также можно вернуть функцию из globalSetup, которая будет использоваться для глобальной очистки. Данные, такие как номер порта, токены аутентификации и т. д., можно передать из глобальной настройки в тесты с помощью переменных окружения.
примечаниеОбратите внимание:
globalSetupиglobalTeardownне поддерживают некоторые возможности — подробное сравнение см. в разделе «Введение». Чтобы получить полную поддержку возможностей, рассмотрите возможность использования зависимостей проектов.
import { defineConfig } from '@playwright/test';
export default defineConfig({
globalSetup: require.resolve('./global-setup'),
globalTeardown: require.resolve('./global-teardown'),
}); Пример
Ниже приведён пример глобальной настройки, которая выполняет аутентификацию один раз и повторно использует состояние аутентификации в тестах. В нём используются параметры baseURL и storageState из файла конфигурации.
import { chromium, type FullConfig } from '@playwright/test';
async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await page.context().storageState({ path: storageState as string });
await browser.close();
}
export default globalSetup; Укажите globalSetup, baseURL и storageState в файле конфигурации.
import { defineConfig } from '@playwright/test';
export default defineConfig({
globalSetup: require.resolve('./global-setup'),
use: {
baseURL: 'http://localhost:3000/',
storageState: 'state.json',
},
}); Тесты запускаются уже с выполненной аутентификацией, так как мы указываем storageState, заданный глобальной настройкой.
import { test } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('/');
// You are signed in!
}); Чтобы сделать произвольные данные доступными в тестах из файла глобальной настройки, задайте их в качестве переменных окружения с помощью process.env.
import type { FullConfig } from '@playwright/test';
async function globalSetup(config: FullConfig) {
process.env.FOO = 'some data';
// Or a more complicated data structure as JSON:
process.env.BAR = JSON.stringify({ some: 'data' });
}
export default globalSetup; Тестам доступны свойства process.env, заданные в глобальной настройке.
import { test } from '@playwright/test';
test('test', async ({ page }) => {
// environment variables which are set in globalSetup are only available inside test().
const { FOO, BAR } = process.env;
// FOO and BAR properties are populated.
expect(FOO).toEqual('some data');
const complexData = JSON.parse(BAR);
expect(BAR).toEqual({ some: 'data' });
}); Сохранение трассировки ошибок во время глобальной настройки
В некоторых случаях может быть полезно сохранить трассировку ошибок, возникших во время глобальной настройки. Для этого необходимо начать запись трассировки при настройке и обязательно остановить запись трассировки, если до выброса ошибки возникает другая ошибка. Этого можно добиться, поместив настройку в блок try...catch. Ниже приведён пример, расширяющий пример глобальной настройки для сохранения трассировки.
import { chromium, type FullConfig } from '@playwright/test';
async function globalSetup(config: FullConfig) {
const { baseURL, storageState } = config.projects[0].use;
const browser = await chromium.launch();
const context = await browser.newContext();
const page = await context.newPage();
try {
await context.tracing.start({ screenshots: true, snapshots: true });
await page.goto(baseURL!);
await page.getByLabel('User Name').fill('user');
await page.getByLabel('Password').fill('password');
await page.getByText('Sign in').click();
await context.storageState({ path: storageState as string });
await context.tracing.stop({
path: './test-results/setup-trace.zip',
});
await browser.close();
} catch (error) {
await context.tracing.stop({
path: './test-results/failed-setup-trace.zip',
});
await browser.close();
throw error;
}
}
export default globalSetup;
© 2026 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-global-setup-teardown