TestProject
Playwright Test поддерживает одновременный запуск нескольких тестовых проектов. Это полезно для выполнения тестов в нескольких конфигурациях. Например, рассмотрите возможность запуска тестов в нескольких браузерах. Этот тип описывает формат проекта в файле конфигурации, для доступа к разрешенным параметрам конфигурации во время выполнения используйте [FullProject].
TestProject
инкапсулирует конфигурацию, специфичную для одного проекта. Проекты настраиваются в testConfig.projects, указанных в файле конфигурации. Обратите внимание, что все свойства [TestProject] доступны в верхнем уровне [TestConfig], в этом случае они общие для всех проектов.
Вот пример конфигурации, которая запускает каждый тест в Chromium, Firefox и WebKit, как в настольных, так и в мобильных версиях.
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
// Опции, общие для всех проектов.
timeout: 30000,
use: {
ignoreHTTPSErrors: true,
},
// Опции, специфичные для каждого проекта.
projects: [
{
name: 'chromium',
use: devices['Desktop Chrome'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
},
{
name: 'Mobile Chrome',
use: devices['Pixel 5'],
},
{
name: 'Mobile Safari',
use: devices['iPhone 12'],
},
],
});
Свойства
dependencies
Добавлено в: v1.31Список проектов, которые должны быть выполнены до запуска любого теста в этом проекте. Зависимости могут быть полезны для настройки глобальных действий установки таким образом, чтобы каждое действие было в форме теста. Передача аргумента --no-deps
игнорирует зависимости и ведет себя так, как если бы они не были указаны.
Использование зависимостей позволяет глобальной установке создавать трассировки и другие артефакты, видеть шаги установки в отчете о тестировании и т.д.
Использование
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'setup',
testMatch: /global.setup\.ts/,
},
{
name: 'chromium',
use: devices['Desktop Chrome'],
dependencies: ['setup'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
dependencies: ['setup'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
dependencies: ['setup'],
},
],
});
Тип
- [Array]<[string]>
expect
Добавлено в: v1.10Конфигурация для библиотеки утверждений expect
.
Используйте testConfig.expect, чтобы изменить эту опцию для всех проектов.
Использование
testProject.expect
Тип
- [Object]
-
timeout
[number] (опционально)Тайм-аут по умолчанию для асинхронных сопоставителей expect в миллисекундах, по умолчанию 5000мс.
-
toHaveScreenshot
[Object] (опционально)-
threshold
[number] (опционально)допустимая воспринимаемая разница в цвете между одним и тем же пикселем в сравниваемых изображениях, в диапазоне от
0
(строго) до1
(мягко). Компаратор"pixelmatch"
вычисляет разницу в цвете в цветовом пространстве YIQ и по умолчанию устанавливает значениеthreshold
в0.2
. -
maxDiffPixels
[number] (опционально)допустимое количество пикселей, которые могут отличаться, по умолчанию не установлено.
-
maxDiffPixelRatio
[number] (опционально)допустимое соотношение пикселей, которые отличаются, к общему количеству пикселей, между
0
и1
, по умолчанию не установлено. -
animations
"allow" | "disabled" (опционально)См. animations в page.screenshot(). По умолчанию
"disabled"
. -
caret
"hide" | "initial" (опционально)См. caret в page.screenshot(). По умолчанию
"hide"
. -
scale
"css" | "device" (опционально)См. scale в page.screenshot(). По умолчанию
"css"
. -
stylePath
[string] | [Array]<[string]> (опционально)См. style в page.screenshot().
-
pathTemplate
[string] (опционально)Шаблон, управляющий расположением скриншотов. См. testProject.snapshotPathTemplate для деталей.
Конфигурация для метода expect(page).toHaveScreenshot().
-
-
toMatchAriaSnapshot
[Object] (опционально)-
pathTemplate
[string] (опционально)Шаблон, управляющий расположением снимков aria. См. testProject.snapshotPathTemplate для деталей.
Конфигурация для метода expect(locator).toMatchAriaSnapshot().
-
-
toMatchSnapshot
[Object] (опционально)-
threshold
[number] (опционально)допустимая воспринимаемая разница в цвете между одним и тем же пикселем в сравниваемых изображениях, в диапазоне от
0
(строго) до1
(мягко). Компаратор"pixelmatch"
вычисляет разницу в цвете в цветовом пространстве YIQ и по умолчанию устанавливает значениеthreshold
в0.2
. -
maxDiffPixels
[number] (опционально)допустимое количество пикселей, которые могут отличаться, по умолчанию не установлено.
-
maxDiffPixelRatio
[number] (опционально)допустимое соотношение пикселей, которые отличаются, к общему количеству пикселей, между
0
и1
, по умолчанию не установлено.
Конфигурация для метода expect(value).toMatchSnapshot().
-
-
toPass
[Object] (опционально)-
timeout
[number] (опционально)тайм-аут для метода toPass в миллисекундах.
-
intervals
[Array]<[number]> (опционально)интервалы проверки для метода toPass в миллисекундах.
Конфигурация для метода expect(value).toPass().
-
-
fullyParallel
Добавлено в: v1.10Playwright Test выполняет тесты параллельно. Для этого он запускает несколько рабочих процессов, которые выполняются одновременно. По умолчанию тестовые файлы выполняются параллельно. Тесты в одном файле выполняются по порядку, в одном рабочем процессе.
Вы можете настроить весь тестовый проект на одновременное выполнение всех тестов во всех файлах, используя эту опцию.
Использование
testProject.fullyParallel
Тип
- [boolean]
grep
Добавлено в: v1.10Фильтр для выполнения только тех тестов, заголовок которых соответствует одному из шаблонов. Например, передача grep: /cart/
должна выполнять только тесты с "cart" в заголовке. Также доступно глобально и в командной строке с опцией -g
. Регулярное выражение будет проверяться на строке, состоящей из имени проекта, имени тестового файла, имени test.describe
(если есть), имени теста и тегов теста, разделенных пробелами, например, chromium my-test.spec.ts my-suite my-test
.
Опция grep
также полезна для тегирования тестов.
Использование
testProject.grep
Тип
- [RegExp] | [Array]<[RegExp]>
grepInvert
Добавлено в: v1.10Фильтр для выполнения только тех тестов, заголовок которых не соответствует одному из шаблонов. Это противоположность testProject.grep. Также доступно глобально и в командной строке с опцией --grep-invert
.
Опция grepInvert
также полезна для тегирования тестов.
Использование
testProject.grepInvert
Тип
- [RegExp] | [Array]<[RegExp]>
ignoreSnapshots
Добавлено в: v1.44Пропускать ли ожидания снимков, такие как expect(value).toMatchSnapshot()
и await expect(page).toHaveScreenshot()
.
Использование
Следующий пример будет выполнять утверждения скриншотов только в Chromium.
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'chromium',
use: devices['Desktop Chrome'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
ignoreSnapshots: true,
},
{
name: 'webkit',
use: devices['Desktop Safari'],
ignoreSnapshots: true,
},
],
});
Тип
- [boolean]
metadata
Добавлено в: v1.10Метаданные, которые будут помещены непосредственно в отчет о тестировании, сериализованный как JSON.
Использование
testProject.metadata
Тип
- [Metadata]
name
Добавлено в: v1.10Имя проекта отображается в отчете и во время выполнения теста.
Playwright выполняет файл конфигурации несколько раз. Не создавайте динамически нестабильные значения в вашей конфигурации.
Использование
testProject.name
Тип
- [string]
outputDir
Добавлено в: v1.10Директория вывода для файлов, созданных во время выполнения теста. По умолчанию <package.json-directory>/test-results
.
Эта директория очищается в начале. При выполнении теста создается уникальная поддиректория внутри testProject.outputDir, что гарантирует, что тесты, выполняемые параллельно, не конфликтуют. Эта директория может быть доступна через testInfo.outputDir и testInfo.outputPath().
Вот пример, который использует testInfo.outputPath() для создания временного файла.
import { test, expect } from '@playwright/test';
import fs from 'fs';
test('example test', async ({}, testInfo) => {
const file = testInfo.outputPath('temporary-file.txt');
await fs.promises.writeFile(file, 'Put some data to the file', 'utf8');
});
Используйте testConfig.outputDir, чтобы изменить эту опцию для всех проектов.
Использование
testProject.outputDir
Тип
- [string]
repeatEach
Добавлено в: v1.10Количество повторений каждого теста, полезно для отладки нестабильных тестов.
Используйте testConfig.repeatEach, чтобы изменить эту опцию для всех проектов.
Использование
testProject.repeatEach
Тип
- [number]
respectGitIgnore
Добавлено в: v1.45Пропускать ли записи из .gitignore
при поиске тестовых файлов. По умолчанию, если ни testConfig.testDir, ни testProject.testDir явно не указаны, Playwright будет игнорировать любые тестовые файлы, соответствующие записям .gitignore
. Эта опция позволяет переопределить это поведение.
Использование
testProject.respectGitIgnore
Тип
- [boolean]
retries
Добавлено в: v1.10Максимальное количество попыток повторного выполнения для неудачных тестов. Узнайте больше о повторных попытках тестов.
Используйте test.describe.configure(), чтобы изменить количество повторных попыток для конкретного файла или группы тестов.
Используйте testConfig.retries, чтобы изменить эту опцию для всех проектов.
Использование
testProject.retries
Тип
- [number]
snapshotDir
Добавлено в: v1.10Базовая директория, относительно файла конфигурации, для файлов снимков, созданных с помощью toMatchSnapshot
. По умолчанию testProject.testDir.
Директория для каждого теста может быть доступна через testInfo.snapshotDir и testInfo.snapshotPath().
Этот путь будет служить базовой директорией для директории снимков каждого тестового файла. Установив snapshotDir
в 'snapshots'
, testInfo.snapshotDir будет разрешаться в snapshots/a.spec.js-snapshots
.
Использование
testProject.snapshotDir
Тип
- [string]
snapshotPathTemplate
Добавлено в: v1.28Эта опция настраивает шаблон, управляющий расположением снимков, создаваемых expect(page).toHaveScreenshot(), expect(locator).toMatchAriaSnapshot() и expect(value).toMatchSnapshot().
Вы можете настроить шаблоны для каждого утверждения отдельно в testConfig.expect.
Использование
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
// Единый шаблон для всех утверждений
snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}',
// Шаблоны, специфичные для утверждений
expect: {
toHaveScreenshot: {
pathTemplate: '{testDir}/__screenshots__{/projectName}/{testFilePath}/{arg}{ext}',
},
toMatchAriaSnapshot: {
pathTemplate: '{testDir}/__snapshots__/{testFilePath}/{arg}{ext}',
},
},
});
Тип
- [string]
Детали
Значение может включать некоторые "токены", которые будут заменены фактическими значениями во время выполнения теста.
Рассмотрим следующую структуру файлов:
playwright.config.ts
tests/
└── page/
└── page-click.spec.ts
И следующий page-click.spec.ts
, который использует вызов toHaveScreenshot()
:
import { test, expect } from '@playwright/test';
test.describe('suite', () => {
test('test should work', async ({ page }) => {
await expect(page).toHaveScreenshot(['foo', 'bar', 'baz.png']);
});
});
Список поддерживаемых токенов:
{arg}
- Относительный путь снимка без расширения. Это исходит из аргументов, переданных вtoHaveScreenshot()
,toMatchAriaSnapshot()
илиtoMatchSnapshot()
; если вызвано без аргументов, это будет автоматически сгенерированное имя снимка.- Значение:
foo/bar/baz
- Значение:
{ext}
- Расширение снимка (с ведущей точкой).- Значение:
.png
- Значение:
{platform}
- Значениеprocess.platform
.{projectName}
- Имя проекта, безопасное для файловой системы, если оно есть.- Значение:
''
(пустая строка).
- Значение:
{snapshotDir}
- testProject.snapshotDir проекта.- Значение:
/home/playwright/tests
(так какsnapshotDir
не указан в конфигурации, он по умолчанию равенtestDir
)
- Значение:
{testDir}
- testProject.testDir проекта.- Значение:
/home/playwright/tests
(абсолютный путь, так какtestDir
разрешается относительно директории с конфигурацией)
- Значение:
{testFileDir}
- Директории в относительном пути отtestDir
до тестового файла.- Значение:
page
- Значение:
{testFileName}
- Имя тестового файла с расширением.- Значение:
page-click.spec.ts
- Значение:
{testFilePath}
- Относительный путь отtestDir
до тестового файла.- Значение:
page/page-click.spec.ts
- Значение:
{testName}
- Имя теста, безопасное для файловой системы, включая родительские описания, но исключая имя файла.- Значение:
suite-test-should-work
- Значение:
Каждый токен может быть предшествован одним символом, который будет использоваться только если этот токен имеет непустое значение.
Рассмотрим следующую конфигурацию:
import { defineConfig } from '@playwright/test';
export default defineConfig({
snapshotPathTemplate: '__screenshots__{/projectName}/{testFilePath}/{arg}{ext}',
testMatch: 'example.spec.ts',
projects: [
{ use: { browserName: 'firefox' } },
{ name: 'chromium', use: { browserName: 'chromium' } },
],
});
В этой конфигурации:
- Первый проект не имеет имени, поэтому его снимки будут храниться в
<configDir>/__screenshots__/example.spec.ts/...
. - Второй проект имеет имя, поэтому его снимки будут храниться в
<configDir>/__screenshots__/chromium/example.spec.ts/..
. - Поскольку
snapshotPathTemplate
разрешается в относительный путь, он будет разрешаться относительноconfigDir
. - Прямые слэши
"/"
могут использоваться как разделители путей на любой платформе.
teardown
Добавлено в: v1.34Имя проекта, который должен быть выполнен после завершения этого и всех зависимых проектов. Teardown полезен для очистки любых ресурсов, приобретенных этим проектом.
Передача аргумента --no-deps
игнорирует testProject.teardown и ведет себя так, как если бы он не был указан.
Использование
Общая схема - это зависимость "setup", которая имеет соответствующий "teardown":
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'setup',
testMatch: /global.setup\.ts/,
teardown: 'teardown',
},
{
name: 'teardown',
testMatch: /global.teardown\.ts/,
},
{
name: 'chromium',
use: devices['Desktop Chrome'],
dependencies: ['setup'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
dependencies: ['setup'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
dependencies: ['setup'],
},
],
});
Тип
- [string]
testDir
Добавлено в: v1.10Директория, которая будет рекурсивно сканироваться на наличие тестовых файлов. По умолчанию это директория файла конфигурации.
Каждый проект может использовать другую директорию. Вот пример, который выполняет smoke-тесты в трех браузерах и все остальные тесты в стабильной версии Chrome.
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'Smoke Chromium',
testDir: './smoke-tests',
use: {
browserName: 'chromium',
}
},
{
name: 'Smoke WebKit',
testDir: './smoke-tests',
use: {
browserName: 'webkit',
}
},
{
name: 'Smoke Firefox',
testDir: './smoke-tests',
use: {
browserName: 'firefox',
}
},
{
name: 'Chrome Stable',
testDir: './',
use: {
browserName: 'chromium',
channel: 'chrome',
}
},
],
});
Используйте testConfig.testDir, чтобы изменить эту опцию для всех проектов.
Использование
testProject.testDir
Тип
- [string]
testIgnore
Добавлено в: v1.10Файлы, соответствующие одному из этих шаблонов, не выполняются как тестовые файлы. Сопоставление выполняется с абсолютным путем файла. Строки рассматриваются как шаблоны глобов.
Например, '**/test-assets/**'
будет игнорировать любые файлы в директории test-assets
.
Используйте testConfig.testIgnore, чтобы изменить эту опцию для всех проектов.
Использование
testProject.testIgnore
Тип
- [string] | [RegExp] | [Array]<[string] | [RegExp]>
testMatch
Добавлено в: v1.10Только файлы, соответствующие одному из этих шаблонов, выполняются как тестовые файлы. Сопоставление выполняется с абсолютным путем файла. Строки рассматриваются как шаблоны глобов.
По умолчанию Playwright ищет файлы, соответствующие следующему шаблону глоба: **/*.@(spec|test).?(c|m)[jt]s?(x)
. Это означает файлы JavaScript или TypeScript с суффиксом ".test"
или ".spec"
, например, login-screen.wrong-credentials.spec.ts
.
Используйте testConfig.testMatch, чтобы изменить эту опцию для всех проектов.
Использование
testProject.testMatch
Тип
- [string] | [RegExp] | [Array]<[string] | [RegExp]>
timeout
Добавлено в: v1.10Тайм-аут для каждого теста в миллисекундах. По умолчанию 30 секунд.
Это базовый тайм-аут для всех тестов. Каждый тест может настроить свой собственный тайм-аут с помощью test.setTimeout(). Каждый файл или группа тестов может настроить тайм-аут с помощью test.describe.configure().
Используйте testConfig.timeout, чтобы изменить эту опцию для всех проектов.
Использование
testProject.timeout
Тип
- [number]
use
Добавлено в: v1.10Опции для всех тестов в этом проекте, например, testOptions.browserName. Узнайте больше о конфигурации и смотрите [доступные опции][TestOptions].
import { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'Chromium',
use: {
browserName: 'chromium',
},
},
],
});
Используйте testConfig.use, чтобы изменить эту опцию для всех проектов.
Использование
testProject.use
Тип
- [TestOptions]