Spec-Zone.ru › Playwright

Параллельность

Введение​

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

  • Вы можете настроить тесты, используя test.describe.configure, чтобы запустить тесты в одном файле параллельно.
  • Вы можете настроить весь проект для выполнения всех тестов во всех файлах параллельно, используя testProject.fullyParallel или testConfig.fullyParallel.
  • Чтобы отключить параллельность, ограничьте количество рабочих процессов одним.

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

Рабочие процессы​

Все тесты выполняются в рабочих процессах. Эти процессы являются процессами ОС, работающими независимо, управляемыми запуском тестов. У всех рабочих процессов одинаковая среда, и каждый запускает свой браузер.

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

Рабочие процессы всегда завершаются после ошибки теста для обеспечения чистоты среды для последующих тестов.

Ограничение рабочих процессов​

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

Из командной строки:

npx playwright test --workers 4

В файле конфигурации:

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

export default defineConfig({
  // Limit the number of workers on CI, use default locally
  workers: process.env.CI ? 2 : undefined,
});

Отключение параллельности​

Вы можете отключить любую параллельность, разрешив только один рабочий процесс в любой момент. Установите workers: 1 параметр в файле конфигурации или передайте --workers=1 в командную строку.

npx playwright test --workers=1

Параллелизация тестов в одном файле​

По умолчанию тесты в одном файле выполняются последовательно. Если у вас много независимых тестов в одном файле, вы можете запустить их параллельно с помощью test.describe.configure().

Обратите внимание, что параллельные тесты выполняются в отдельных рабочих процессах и не могут совместно использовать состояние или глобальные переменные. Каждый тест выполняет все соответствующие хуки только для себя, включая beforeAll и afterAll.

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

test.describe.configure({ mode: 'parallel' });

test('runs in parallel 1', async ({ page }) => { /* ... */ });
test('runs in parallel 2', async ({ page }) => { /* ... */ });

В качестве альтернативы вы можете включить все тесты в этот полностью параллельный режим в файле конфигурации:

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

export default defineConfig({
  fullyParallel: true,
});

Вы также можете включить полностью параллельный режим только для некоторых проектов:

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

export default defineConfig({
  // runs all tests in all files of a specific project in parallel
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
      fullyParallel: true,
    },
  ]
});

Последовательный режим​

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

примечание

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

import { test, type Page } from '@playwright/test';

// Annotate entire file as serial.
test.describe.configure({ mode: 'serial' });

let page: Page;

test.beforeAll(async ({ browser }) => {
  page = await browser.newPage();
});

test.afterAll(async () => {
  await page.close();
});

test('runs first', async () => {
  await page.goto('https://playwright.dev/');
});

test('runs second', async () => {
  await page.getByText('Get Started').click();
});

Разбиение тестов между несколькими машинами​

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

npx playwright test --shard=2/3

Ограничение ошибок и быстрое завершение при ошибке​

Вы можете ограничить количество ошибочных тестов во всем наборе тестов, установив maxFailures параметр конфигурации или передав --max-failures флаг командной строки.

При запуске с установленным «максимумом ошибок» Playwright Test остановится после достижения этого числа ошибочных тестов и пропустит любые тесты, которые еще не были выполнены. Это полезно, чтобы избежать траты ресурсов на сломанные наборы тестов.

Передача параметра командной строки:

npx playwright test --max-failures=10

Установка в файле конфигурации:

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

export default defineConfig({
  // Limit the number of failures on CI to save resources
  maxFailures: process.env.CI ? 10 : undefined,
});

Индекс рабочего процесса и индекс параллелизма​

Каждый рабочий процесс получает два идентификатора: уникальный индекс рабочего процесса, начинающийся с 1, и индекс параллелизма, который находится между 0 и workers - 1. Когда рабочий процесс перезапускается, например, после ошибки, новый рабочий процесс имеет тот же parallelIndex и новый workerIndex.

Вы можете прочитать индекс из переменных среды process.env.TEST_WORKER_INDEX и process.env.TEST_PARALLEL_INDEX, или получить доступ к ним через testInfo.workerIndex и testInfo.parallelIndex.

Изоляция данных тестов между параллельными рабочими процессами​

Вы можете использовать process.env.TEST_WORKER_INDEX или testInfo.workerIndex, упомянутые выше, чтобы изолировать пользовательские данные в базе данных между тестами, выполняемыми на разных рабочих процессах. Все тесты, выполняемые рабочим процессом, повторно используют одного и того же пользователя.

Создайте playwright/fixtures.ts файл, который будет создавать dbUserName фикстуру и инициализировать нового пользователя в тестовой базе данных. Используйте testInfo.workerIndex, чтобы различать рабочие процессы.

import { test as baseTest, expect } from '@playwright/test';
// Import project utils for managing users in the test database.
import { createUserInTestDatabase, deleteUserFromTestDatabase } from './my-db-utils';

export * from '@playwright/test';
export const test = baseTest.extend<{}, { dbUserName: string }>({
  // Returns db user name unique for the worker.
  dbUserName: [async ({ }, use) => {
    // Use workerIndex as a unique identifier for each worker.
    const userName = `user-${test.info().workerIndex}`;
    // Initialize user in the database.
    await createUserInTestDatabase(userName);
    await use(userName);
    // Clean up after the tests are done.
    await deleteUserFromTestDatabase(userName);
  }, { scope: 'worker' }],
});

Теперь каждый файл тестов должен импортировать test из файла фикстур вместо @playwright/test.

// Important: import our fixtures.
import { test, expect } from '../playwright/fixtures';

test('test', async ({ dbUserName }) => {
  // Use the user name in the test.
});

Управление порядком тестов​

Playwright Test выполняет тесты из одного файла в порядке объявления, если вы не параллелизуете тесты в одном файле.

Нет гарантии порядка выполнения тестов между файлами, поскольку Playwright Test по умолчанию выполняет файлы тестов параллельно. Однако, если вы отключите параллельность, вы можете контролировать порядок тестов, называя файлы в алфавитном порядке или используя файл «списка тестов».

Сортировка файлов тестов в алфавитном порядке​

При отключении параллельного выполнения тестов Playwright Test выполняет файлы тестов в алфавитном порядке. Вы можете использовать некоторую систему именования для управления порядком тестов, например 001-user-signin-flow.spec.ts, 002-create-new-document.spec.ts и так далее.

Использование файла «списка тестов»​

предупреждение

Списки тестов не рекомендуются и поддерживаются только в лучшем случае. Некоторые функции, такие как расширение VS Code и отслеживание, могут работать неправильно со списками тестов.

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

import { test, expect } from '@playwright/test';

export default function createTests() {
  test('feature-a example test', async ({ page }) => {
    // ... test goes here
  });
}
import { test, expect } from '@playwright/test';

export default function createTests() {
  test.use({ viewport: { width: 500, height: 500 } });

  test('feature-b example test', async ({ page }) => {
    // ... test goes here
  });
}

Вы можете создать файл списка тестов, который будет управлять порядком тестов — сначала выполните feature-b тесты, затем feature-a тесты. Обратите внимание, как каждый файл тестов заключён в блок test.describe(), который вызывает функцию, где определены тесты. Таким образом, test.use() вызовы влияют только на тесты из одного файла.

import { test } from '@playwright/test';
import featureBTests from './feature-b.spec.ts';
import featureATests from './feature-a.spec.ts';

test.describe(featureBTests);
test.describe(featureATests);

Теперь отключите параллельное выполнение, установив количество рабочих процессов в один, и укажите файл вашего списка тестов.

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

export default defineConfig({
  workers: 1,
  testMatch: 'test.list.ts',
});
примечание

Не определяйте свои тесты непосредственно в вспомогательном файле. Это может привести к неожиданным результатам, поскольку ваши тесты теперь зависят от порядка import/require инструкций. Вместо этого заключите тесты в функцию, которая будет явно вызываться файлом списка тестов, как в приведённом выше примере.

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

Spec-Zone.ru

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