Під час створення проекту тестів (як приклад Playwright JavaScript – перший end-to-end тест), після виконання команди:

npm init playwright@latest

в корені проекту Playwright автоматично створює файл playwright.config.js, котрий містить наступний перелік базових налаштувань:

const { defineConfig, devices } = require('@playwright/test');

module.exports = defineConfig({
  testDir: './',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: 'html',
  use: {
    trace: 'on-first-retry',
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },

    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },

    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },
  ],
});

Вміст файлу playwright.config.js можна розбити на кілька розділів:

General config (загальні налаштування)

Цей розділ, одразу після генерації файлу playwright.config.js, містить наступні властивості, котрі знаходяться на верхньому рівні об’єкту конфігурації:

testDir – задає каталог, в якому буде відбуватись пошук файлів з тестами. За замовчуванням – це каталог конфігураційного файлу.

fullyParallel – якщо встановлено true, усі тести в усіх тестових файлах, будуть виконуватись паралельно.

forbidOnly – для запуску окремого тесту, у Playwright можна додати до нього .only (тобто test.only), що може бути зручно під час локальної роботи над одним з тестів. Але зазвичай відсутня потреба виконувати лише один окремий тест у вашому pipeline, і ви не хочете щоб test.only туди потрапив. Встановлення властивості forbidOnly у true (наприклад !!process.env.CI), призведе до завершення запуску тестів з загальною помилкою, якщо буде виявлено тести або групи, визначені як test.only() або test.describe.only().

retries – визначає кількість спроб, за яку Playwright намагатиметься отримати успішний результат тесту, у випадку невдалої спроби. Значення за замовчуванням дорівнює 0.

workers – максимальна кількість паралельних робочих процесів, задіяних для розпаралелювання тестів. Також можна задати значення у відсотках, від кількості логічних ядер процесора (наприклад "50%").

reporter – визначає генератор для звітів про виконання тестів. Приклади вбудованих репортерів: dot, github, html, json, junit, line, list. Докладніше за посиланням: Playwright Reporters

Також сюди можна власноруч додати деякі корисні властивості для налаштувань, як наприклад:

timeout – максимальний час для виконання кожного тесту. За замовчуванням, Playwright встановлює timeout для кожного тесту 30 секунд. Сюди включається час витрачений тестовою функцією, її тестовими фікстурами та хуками beforeEach.

globalTimeout – максимальний час виконання всього набору тестів. Налаштування цієї опції дозволить завершити виконання тестів, якщо заданий час буде перевищено.

globalSetup та globalTeardown – визначають файли, які будуть виконані перед запуском та після завершення набору тестів (test suite) відповідно. При цьому, файли глобальних налаштувань повинні експортувати лише одну функцію. Докладніше у документації: Test Config Globat Setup

name – ім’я вашого тестового набору, що буде відображатись під час виконання тестів та у звіті.

snapshotDir – шлях до каталогу, де зберігаються знімки екрану (використовуються для візуальних регресійних тестів).

outputDir – шлях до каталогу, де зберігаються результати тестів (трасування, відео, скріншоти). Ця директорія автоматично очищується, в момент запуску набору тестів. Далі, під час запуску тесту, всередині outputDir для нього створюється унікальний підкаталог, що гарантує відсутність конфлікту між паралельно запущеними тестами. За замовчуванням має значення, що дорівнює <package.json-directory>/test-results

testMatch – визначає шаблон, який використовується для іменування тестових файлів (наприклад testMatch: "**/?(*.)@(spec|test).*"). Тільки файли, абсолютний шлях яких відповідає шаблону, виконуються в якості тестів.

testIgnore – по аналогії з testMatch, можна використовувати testIgnore, щоб задати шаблон імен файлів, які будуть проігноровані під час виконання тестів.

maxFailures – у цій властивості, можна вказати максимальну кількість збоїв (невдалих тестів), допустиму під час запуску набору тестів (test suite), після яких test run завершиться з кодом 1 (невдало). Це може бути зручним в CI Jobs, щоб не витрачати ресурси даремно, коли вже відомо, що pipeline не пройде. Приклад налаштування:

maxFailures: process.env.CI ? 1 : 0

reportSlowTests – тести, час виконання яких перевищує встановлений максимум, вважаються повільними (slow), і найбільш повільні з них потрапляють до звіту про test run (але не більше кількості, заданої у властивості reportSlowTests). За замовчуванням дорівнює 5, тобто в кінці вашого тестового прогону, до 5 самих повільних тестів, потрапить у звіт як slow. Щоб вимкнути цю функцію, потрібно встановити значення null. Якщо вказати 0, в якості максимального значення, буде повідомлено про всі тести, що перевищують часовий поріг. Тут же можна вказати і порогове значення у мілісекундах, для повільного тесту. Приклад налаштування:

reportSlowTests: { max: 5, threshold: 15000 }

expect – ця властивість стосується тверджень у тестах. Тут можна перевизначити timeout для тверджень за замовчуванням (5000 мілісекунд), якщо у ваших тестах вони потребують більше часу. Приклад налаштування:

expect: {
  timeout: 6000,
}

Докладніше про цей розділ налаштувань в документації: Playwright TestConfig

Use

Playwright надає багато параметрів для налаштування тестового середовища, браузера, контекста браузера, тощо. Ці опції містяться в об’єкті use: {}, з об’єкта конфігурації. Розглянемо деякі з них:

trace – за замовчуванням, файл playwright.config створюється з налаштуванням цієї опції встановленим як 'on-first-retry'. Це означає, що трасування (файл trace.zip) буде записано лише під час першої повторної спроби виконання тесту, після невдачі. Якщо тест проходить вдало з першого разу, трасування не зберігається, що допомагає зменшити використання ресурсів та обсяг збережених логів.

baseURL – базова URL-адреса, встановивши котру, ви можете переходити на різні сторінки вашого додатку за допомогою відносного шляху (замість того, щоб повторювати повну URL-адресу кожного разу, коли ви використовуєте page.goto() у своїх тестах).

actionTimeout – якщо не встановлено, то має значення за замовчуванням 0. Додає timeout в мілісекундах для дій на сторінці, таких як click(), type(), тощо.

navigationTimeout – задає timeout в мілісекундах для кожної дії навігації(за замовчуванням 0). Дає змогу почекати, поки сторінка завантажиться, у випадках коли наприклад page.goto() в додатку виконується трохи довше.

geolocation – якщо є потреба перевірити, як виглядає і працює ваш додаток, коли ним користується користувач з іншої частини світу (чи змінюється локалізація, чи бачить користувач відповідну мовну версію, тощо), є можливість вказати бажану геолокацію у цій властивості.

permissions – надає певні дозволи контексту браузера. Приклад налаштування:

permissions: ['notifications', 'geolocation']

headless – режим браузера, в якому запускаються тести. За замовчуванням true (безголовий), тобто вікно браузера не відображається під час виконання тестів (що економить ресурси).

ignoreHTTPSErrors – визначає, чи потрібно ігнорувати помилки HTTPS в результаті мережевих запитів (що надсилаються в процесі взаємодії з вашим додатком). Значення за замовчуванням false.

screenshot , video та trace – у цих властивостях можна вказати, чи потрібно зберігати відповідні артефакти тестів у каталозі результатів. Доступні варіанти значень: on, off, retain-on-failure.

viewport – визначає розмір області перегляду під час тестів, яка використовується для всіх сторінок (за замовчуванням – 1280×720). Приклад налаштування:

viewport: { width: 1280, height: 720 }

storageState – використовується для завантаження збереженого storage браузера (local storage, session storage, cookie). Це наприклад дозволяє уникати повторного входу до системи (login) у кожному тесті, що може зекономити час для виконання тестів:

storageState: 'storageState.json', // Шлях до файлу зі станом

proxy – дозволяє налаштувати проксі-сервер, через який будуть направлятись запити з браузера, під час виконання тестів. Приклад налаштування:

use: {
  proxy: {
    server: 'http://proxy.example.com:8080', // Адреса проксі-сервера
    username: 'user', // Ім'я користувача (необов’язково)
    password: 'password', // Пароль (необов’язково)
  },
}

Докладніше про цей розділ налаштувань в документації: Playwright TestOptions

Projects

Project – це логічна група тестів, що запускаються з однаковою конфігурацією. У Playwright проекти також використовуються, щоб мати можливість запускати тести у різних браузерах та пристроях (chromium, webkit, firefox, тощо).

Проекти налаштовуються у файлі playwright.config.js за допомогою властивості projects, об’єкту конфігурації. Після налаштування, ви можете запускати тести на всіх проектах, або тільки на певному проекті. При цьому, для кожного об’єкту з projects, ви можете встановити власні опції (як наприклад baseURL)

Докладніше про цей розділ налаштувань в документації: Playwright Projects

Підсумок

Наостанок, приклад ще однієї версії файлу playwright.config.js, котрий містить деякі з розглянутих вище властивостей:

const { defineConfig, devices } = require('@playwright/test');

module.exports = defineConfig({
  testDir: './tests', // Директорія з тестами
  timeout: 30000, // Максимальний час виконання тесту (мс)
  expect: {
    timeout: 5000, // Тайм-аут для перевірок expect (мс)
  },
  retries: 1, // Кількість повторних спроб у разі невдачі тесту
  reporter: 'html', // Формат звіту
  use: {
    headless: true, // Запуск у безголовому режимі браузера
    viewport: { width: 1280, height: 720 }, // Розмір вікна браузера
    ignoreHTTPSErrors: true, // Ігнорування помилок HTTPS
    video: 'retain-on-failure', // Збереження відео тільки для невдалих тестів
    screenshot: 'only-on-failure', // Зняття скріншотів після кожного невдалого тесту
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },

    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] },
    },

    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },
  ],
});


Мітки: