Параллельность
Введение
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