Когда вы стартуете новый Playwright проект и запускаете:
npm init playwright@latest
автоматически создастся файл playwright.config.js с базовой конфигурацией. В этом посте я хотел бы объяснить, что можно определить в файле конфигурации Playwright.
Содержимое файла можно разделить на несколько разделов:
Общая конфигурация
Свойства, которые можно определить в этом разделе:
timeout— максимальный лимит времени для каждого теста;globalTimeout— максимальный лимит времени для запуска всего тест сьюта. Бесконечный цикл, утечки памяти при запуске CI? Больше нет: выполнение скрипта будет завершено, если превышено заданное время. (Аналог таймаута для выполнения тестов в CI-tool);globalSetupопределяет файл, который будет выполняться до запуска набора тестов,globalTeardownуказывает на файл, который будет выполняться после завершения всех тестов.
В документации Playwright показано, как эти файлы можно использовать, например, для повторной авторизации при выполнении каждого теста;name— название вашего тест-сьюта;- свойство
testDirпозволяет задать каталог, который будет сканироваться на наличие файлов с тестами; snapshotDirпуть к месту, где хранятся снапшоты (используемые для визуальных регрессионных тестов;outputDirпуть к месту хранения результатов тестирования (логи, видео, скриншоты). По умолчанию сохраняются результаты тестирования, но вы можете изменить это значение так, чтобы сохранялись только упавшие тесты. В разделе projects это значение может быть переопределено для требований каждого проекта.
testDir: './tests', timeout: 30 * 1000, globalTimeout: process.env.CI ? 60 * 60 * 1000: 30 * 60 * 1000, globalSetup: './global-setup.js', globalTeardown: './global-teardown.js',
retriesв случае неудачи теста Playwright будет пробовать выполнить тест столько раз, сколько указано в свойствахretries. Значение по умолчанию равно 0. В результате тест, который пришлось повторно запустить для получения успешного результата, будет помечен как flaky, а не failed. Это говорит о том, что необходимо его изменить.forbidOnly— для запуска одного теста вы можете добавить тег.only(пример кода ниже), что отлично помогает при работе над одним тестом. Но обычно вы не хотите выполнять только один тест в CI-пайплайне. СвойствоforbidOnly: trueбудет выдавать ошибку и завершать тесты с кодом 1
test.only('homepage has Playwright
workers— это процессы, которые запускаются независимо в отдельных браузерах. Сколько таких процессов будет создано для выполнения набора тестов, зависит от лимита памяти вашей машины. Программа запуска тестов будет использовать их повторно, поэтому несколько тестовых файлов обычно запускаются в одном worker-e один за другим. Но вы можете захотеть ограничить их количество (например, в CI);fullyParallel— при установке этого свойства вtrueтесты будут выполняться параллельно, что отменяет поведение worker-a по умолчанию — выполнение файла за файлом;- свойство
shardпозволяет разделить тесты для нескольких машин, скажем, 1/2 и 2/2, чтобы запускать их параллельно для ускорения выполнения тестов. Подробнее о реализации в документации testMatchОпределяет шаблон, используемый файлами тестов, например:testMatch: "*/?(.)@(spec|test).*"Тесты выполняются в алфавитном порядке имен файлов. Предоставив файлtestMatch: test.list.jsсо списком тестов, вы можете указать свой порядок выполнения.
АналогичноtestMatchвы можете использоватьtestIgnore— шаблон имени файла, который будет игнорироваться при выполнении теста.maxFailuresвы также можете указать максимальное количество неудач, после которых тесты завершатся с кодом 1. Это удобно для CI, чтобы не тратить ресурсы впустую, если мы знаем, что пайплайн уже не пройдет.
retries: process.env.CI ? 2 : 0, forbidOnly: !!process.env.CI, workers: process.env.CI ? 1 : undefined, fullyParallel: true, testMatch: 'test.list.js', maxFailures: process.env.CI ? 10 : undefined,
grepиgrepInvertВ ваших тестах используются теги типа@develop,@visualдля запуска только определенных тестов? Вы также можете задать его в конфигурации. Лично я предпочитаю передавать его динамически в зависимости от окружения и конкретных тестов, которые нужно запустить.reporterпринимает одну строку или массив массивов и принимает объект с параметрами репортера. Встроенные репортеры на выбор:dot,github,html,json,junit,line,list,null. Или вы можете создать свой собственный. Поэкспериментируйте со всеми из них и посмотрите, какой вам больше подходит.reportSlowTestsПо умолчанию это число равно 5, и в конце выполнения тест-сьюта вы увидите до 5 самых медленных тестов. Вы можете изменить это число здесь, а также указать, что является порогом времени для медленного теста.metadata— это объект, который может быть добавлен в отчет. Это может помочь в отладке тестов, поскольку в метаданные может быть записана информация об операционной системе.
reporter: [
['html', { outputFolder: 'test-results' }],
['json', { outputFolder: 'test-results', outputFile: 'report.json' }],
],
metadata: {
hostFreeMemory: os.freemem()
},
- Playwright может фактически запустить веб-сервер для вас! И будет ждать, пока служба не ответит кодом состояния 2xx HTTP. Просто укажите все необходимые значения, такие как: команда для запуска, порт или URL, таймаут и т.д.
expect— этот раздел относится к утверждениям внутри тестов. Это подходящее место для переопределения таймаута по умолчанию (который составляет 5000 миллисекунд); В этой части вы также можете добавить глобальные настройки для визуальных регрессионных тестов, определив методыtoHaveScreenshotиtoMatchSnapshot, которые будут применяться ко всем вашим визуальным тестам — допустим, вы хотите разрешитьmaxDiffPixelRatioравным 0.01.
expect: {
timeout: 6000,
toHaveScreenshot: {
animations: 'disabled'
},
toMatchSnapshot: {
maxDiffPixelRatio: 0.01
},
},
Раздел Use
Этот раздел содержит свойства, общие между всеми проектами, и значения, определяющие контекст тестов (TestOptions):
acceptDownloadsпринимает булево значение и очень полезно для тестирования функциональности загрузки файлов в приложении.actionTimeoutпо умолчанию равно 0. Добавляет значение таймаута для таких действий на странице, какclick(),type()и т.д.navigationTimeoutpage.goto() в приложении занимает немного больше времени, позволяя странице загрузиться. Вы можете указать таймаут либо здесь, либо в самом методе.
Можно определить его здесь, либо указывать его в отдельных действиях (page.click({ timeout: 1000 })).baseURLбазовый URL тестируемого приложения. Может быть указан напрямую или задаваться переменными окружения (process.env.BASE_URL).serviceWorkersЗдесь вы можете разрешить (allow) или заблокировать (block) регистрацию service workers. По умолчанию разрешено.geolocationДопустим, вы хотите проверить, как выглядит и работает ваше приложение при использовании пользователем из другой части мира, меняется ли локаль и видит ли пользователь свою языковую версию приложения? Здесь вы можете указать желаемую геолокацию.localeиtimezoneId— тестируете i18n (интернационализацию) или l10n (локализацию)? Свойстваlocaleиgeolocationпомогут вам автоматизировать эти тесты.- Когда вы используете геолокацию, не забудьте также дать браузеру разрешение на ее использование, определив его в свойстве
permissions. Здесь также можно разрешить уведомления, запись в буфер обмена, чтение из буфера обмена (для копирования/вставки с API буфера обмена) и т.д. headlessВыполнять тесты в режиме headless или headful браузера; true или false? Обычно true (по умолчанию), так как можно запускать тесты в фоновом режиме, но при работе над тестами и отладке false. Я предпочитаю передавать это значение в команде, а не устанавливать его в конфиге.ignoreHTTPSErrorsс этим значением, установленным в true, вы можете игнорировать ошибки, связанные с HTTPS в локальной среде.
Тестируете ответ API и получаете ошибку? Убедитесь, что у вас установлено это значение.screenshot,videoиtraceздесь вы можете указать, хотите ли вы сохранить их в каталоге результатов тестирования после завершения тестов. Доступные опции:on,off,retain-on-failure. Это очень помогает при отладке неудачных тестов, поэтому мы рекомендуем установить это свойство вon.- Свойство
viewportопределяет область просмотра браузера. Очень полезно в визуальных регрессионных тестах. offlineудобный параметр, если вы тестируете Progressive Web Application и хотите проверить, как приложение ведет себя в автономном состоянии или если вы просто хотите проверить, что видит пользователь, когда сеть недоступна.storageStateвы можете использовать эту опцию, чтобы, скажем, установить cookies для всех ваших тестов. Вы можете просто установить состояние хранилища здесь, а не повторять это во всех тестах.hasTouch,isMobileопции по умолчанию имеют значение false. Могут быть перезаписаны в отдельном тесте, что очень полезно для тестов эмуляции на мобильных устройствах.- Вы можете подключаться к удаленным браузерам и переопределять параметры (браузер, контекст и страницу) с помощью
connectOptions— объекта Option, который принимаетwsEndpointи необязательные заголовки в качестве параметров. browserNameпозволяет указать название браузера (по умолчанию chromium) и сборку (chrome-canary).- если вы тестируете API и вызовы требуют аутентификации, вы можете определить ее в
extraHTTPHeadersчтобы APIRequestContext мог ее использовать. - Настройки прокси также могут быть указаны в конфигурации Playwright, если это требуется для ваших тестов. Эта опция принимает объект с HTTP или SOCKS сервером и именем пользователя и паролем аутентификации.
use: {
acceptDownloads: true,
actionTimeout: 0,
baseURL: 'www.katk.dev',
colorScheme: 'dark',
viewport: { width: 1280, height: 720 },
geolocation: { longitude: 19.944544, latitude: 50.049683 },
headless: false,
ignoreHTTPSErrors: true,
locale: 'en-GB',
permissions: ['notifications', 'geolocation', 'clipboard-read'],
screenshot: 'only-on-failure',
trace: 'retain-on-failure',
video: 'on-first-retry',
}
Раздел Projects
Приведенный пример конфигурационного файла показывает, как его можно использовать для тестирования в разных браузерах и на разных устройствах. Для каждого объекта проекта вы можете предоставить собственные свойства из раздела use:
projects: [
{
name: 'project one',
use: {
...devices['Desktop Chrome'],
baseURL: process.env.POST_ONE_URL || 'www.katk.dev/post-one',
colorScheme: 'light',
storageState: 'storage/user1.json'
},
},
{
name: 'project two',
use: {
...devices['Desktop Chrome'],
baseURL: process.env.POST_TWO_URL || 'www.katk.dev/post-two',
colorScheme: 'dark',
storageState: 'storage/user2.json'
},
},
]
Вот и все! Подробную информацию можно найти на официальном сайте Playwright.
Все вышесказанное взято в основном из моего собственного опыта и проектов, над которыми я работал.
Надеюсь, это помогло вам лучше понять конфигурацию Playwright!
Спасибо за статью