Spec-Zone.ru › Playwright

Настройка и завершение работы глобально

Введение​

Существует два способа настроить глобальную настройку и завершение работы: используя файл глобальной настройки и задавая его в конфигурации в разделе globalSetup или используя зависимости проекта. С зависимостями проекта вы определяете проект, который выполняется перед всеми другими проектами. Это рекомендуемый способ настройки глобальной настройки, поскольку с зависимостями проекта ваш HTML-отчет покажет глобальную настройку, просмотрщик трассировки запишет трассировку настройки, и могут использоваться фикстуры.

Вариант 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
});

Дополнительные примеры​

Для более подробных примеров ознакомьтесь с:

  • нашим руководством по аутентификации
  • нашей статьей в блоге Лучшая глобальная настройка в Playwright, повторное использование входа с зависимостями проекта
  • видео релиза v1.31, чтобы увидеть демонстрацию

Вариант 2: Настройка globalSetup и globalTeardown​

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

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

заметка

Использование globalSetup и globalTeardown не будет создавать трассировки или артефакты, и такие опции, как headless или testIdAttribute, указанные в файле конфигурации, не применяются. Если вы хотите создавать трассировки и артефакты и соблюдать параметры конфигурации, используйте зависимости проекта.

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;

© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-global-setup-teardown

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API