- PVSM.RU - https://www.pvsm.ru -

Начало работы с Playwright (Часть 2)

End to End Testing c 30DaysOfPlaywright

🔖 | Важные ресурсы:

  • Getting Started [3] – полноценный гайд по установке.

  • Auto-waiting [4] – принципы повышения надежности тестов.

  • Web-First Assertions [5] – система повтора действий вплоть до получения желаемого результата.

  • Test Fixtures [6] – помощь в параллелизации тестового процесса.

  • Test Hooks [7] – помощь в настройке и очистке тестовой среды или тестовых данных.

  • Introduction to Playwright Test runner [8] – вводный видеогайд по всем концепциям использования фреймворка.

🎯 Задачи 2-го дня #30DaysOfPlaywright!

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

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

Основы Playwright

В моем первом посте [11] я рекомендовал посмотреть доклад  Introduction to Playwright Test runner [8] как хорошее введение в основы работы с Playwright. Ссылки на него будут периодически возникать в разных разделах руководства.

Для удобства ниже собран подробный список ссылок на видео с таймкодами. Вместе с материалами “Начало работы с Playwright” рекомендую до следующего занятия изучить 1-3 главу руководства.

Разбор тестового скрипта

Давайте вернемся к коду из первого теста, который мы создали и запустили в первый день.

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

test('basic test', async ({ page }) => {
  await page.goto('https://playwright.dev/');
  const title = page.locator('.navbar__inner .navbar__title');
  await expect(title).toHaveText('Playwright');
});

Этот простой тестовый сценарий иллюстрирует некоторые фундаментальные концепции Playwright, которые обеспечивают надежное сквозное тестирование:

  • Умное ожидание [4] – выполнение проверки элементов перед осуществлением запрошенного действия.

  • Web-First Assertions [5] – повторение проверки до тех пор, пока не будет выполнено необходимое условие.

  • Тестовая изоляция с fixtures [6] – создание надежной среды для тестирования, включение распараллеливания.

  • Test Hooks [7] – настройка и очищение общих ресурсов между тестами.

Давайте рассмотрим их вкратце ниже.

Web Assertions

Playwright использует библиотеку expect [22] для утверждений. Разработчики могут проверить, соответствует ли текущее состояние приложения ожидаемому результату. Для этого используется библиотека сопоставления, проверяющая различные условия заданного состояния.

Например:

expect(value).toEqual(0);

Современные веб-приложения динамичны, при этом их состояние постоянно меняется. Проверка утверждений может оказаться сложной задачей, если условие сопоставления нестабильно. Playwright повышает надежность процесса, расширяя библиотеку expect с помощью удобных асинхронных сравнений [23], которые ожидают, пока требующееся условие не будет выполнено.

await expect(page).toHaveTitle("Playwright");

Давайте попробуем пример написания утверждений:

// assert.spec.js
const { test, expect } = require('@playwright/test');

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

  // Expect a title "to contain" a substring.
  await expect(page).toHaveTitle(/Playwright/);

  // Expect an attribute "to be strictly equal" to the value.
  await expect(page.locator('text=Get Started').first()).toHaveAttribute('href', '/docs/intro');

  // Expect an element "to be visible".
  await expect(page.locator('text=Learn more').first()).toBeVisible();

  await page.click('text=Get Started');
  // Expect some text to be visible on the page.
  await expect(page.locator('text=Introduction').first()).toBeVisible();
});

Сохраните его в новом файле (assert.spec.js) и запустите следующим образом:

$ npx playwright test assert.spec.js

Аргумент {page}, представленный в тесте, является примером test fixture. О том, что такое фикстуры, мы поговорим в следующем разделе.

На данный момент вы можете просмотреть документацию по классу page  и увидеть, что он предоставляет методы взаимодействия с одной вкладкой браузера и обработки различных событий. Например:

  • метод  page.locator() [24] – это представление элемента(ов) на странице с фиксированной логикой для его извлечения в нужный момент времени;

  • page.goto() [25] – переход на любую страницу в браузере;

  • page.click() [26] – клик по элементу на странице, соответствующей селектору.

Доступные утверждения в Playwright [27] будут подробно рассмотрены в одном из следующих постов.

Test Fixtures

Вдохновленный pytest [28]-ом, test fixtures – инструмент для создания надежной и согласованной тестовой среды, которая предоставляет тестам именно то, что им нужно для текущего запуска (и не более того). Playwright Test анализирует все fixture, необходимые для тестирования, объединяет требуемые значения в один объект и делает его доступным для test в качестве первого параметра. По окончании теста фикстура демонтируется.

Почему fixture? Потому что они создают согласованную среду (повторяемость тестирования) и обеспечивают эффективную изоляцию для выполняемого теста со следующими преимуществами:

  • Эффективность. Запускайте несколько тестов параллельно, быстрее и с меньшим объемом используемой памяти.

  • Таргетинг. Повторите только что провалившиеся тесты без повторного запуска всего набора.

  • Группировка. Групповые тесты проводятся на основе общего смысла, а не просто заданной установки.

Playwright поставляется с рядом встроенных fixture [29], которые вы можете настроить.

  • fixtures.browser [30] – общий экземпляр браузера (для worker);

  • fixtures.browserName [31] – текущий запуск (chromium, firefox or webkit);

  • fixtures.context [32] – изолирует контекст браузера (для test);

  • fixtures.page [33] – изолирует страницу (per test).

Вы можете использовать Test Fixture [34] на этапе детализации тестирования или Worker Fixtures [35], чтобы применять их на уровне рабочего процесса (во всех контролируемых тестах). 

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

Test Hooks

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

// example.spec.js
const { test, expect } = require('@playwright/test');

test.describe('feature foo', () => {
  test.beforeEach(async ({ page }) => {
    // Go to the starting url before each test.
    await page.goto('https://playwright.dev/');
  });

  test('my test', async ({ page }) => {
    // Assertions use the expect API.
    await expect(page).toHaveURL('https://playwright.dev/');
  });
});

Метод test.describe используется для объявления группы тестов. К тестовым хукам, с которыми нам нужно ознакомиться, относятся:

  • test.beforeEach [36] – выполняется перед началом каждого теста в группе;

  • test.afterEach [36] – запускается после завершения каждого теста в группе;

  • test.beforeAll [37] – запускается один раз для каждой группы перед запуском любых тестов;

  • test.afterAll [38] – запускается один раз для каждой группы после завершения всех тестов.

День 2: Итог и ресурсы

  • [X] Изучена библиотека expect [22], используемая по умолчанию.

  • [X] Изучены  web assertions [27], доступные в Playwright.

  • [X] Рассмотрены fixtures [28] в pytest.

  • [X] Рассмотрены fixtures [39], использующиеся в Playwright.

  • [X] Изучено Playwright Test API [40] для поддержки test hooks.

  • [X] Выполнен Getting Started [3] туториал по Playwright.

Автор: Алексей Иванов

Источник [41]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/371330

Ссылки в тексте:

[1] День 0. Учимся e2e-тестированию с Playwright | #30DaysOfPlaywright: https://habr.com/ru/publication/edit/596873/

[2] День 1. Начало работы с Playwright (Часть 1): https://habr.com/ru/post/597293/

[3] Getting Started: https://playwright.dev/docs/intro

[4] Auto-waiting: https://playwright.dev/docs/actionability

[5] Web-First Assertions: https://playwright.dev/docs/test-timeouts#expect-timeout

[6] Test Fixtures: https://playwright.dev/docs/test-fixtures#introduction-to-fixtures

[7] Test Hooks: https://playwright.dev/docs/intro#using-test-hooks

[8] Introduction to Playwright Test runner: https://youtu.be/JjhY2aFBTTk

[9] Написание assertions: https://playwright.dev/docs/intro#writing-assertions

[10] Использование test fixtures: https://playwright.dev/docs/intro#using-test-fixtures

[11] моем первом посте: https://habr.com/ru/post/596873/

[12] Что такое  Playwright Test?: https://youtu.be/JjhY2aFBTTk?t=121

[13] Почему мы создали Test runner?: https://youtu.be/JjhY2aFBTTk?t=149

[14] Часть 1: Начало работы - Demo: https://youtu.be/JjhY2aFBTTk?t=246

[15] Часть 1: Начало работы - Script: https://youtu.be/JjhY2aFBTTk?t=560

[16] Часть 2: Основы: https://youtu.be/JjhY2aFBTTk?t=609

[17] Часть 3: Конфигурация - Fixtures: https://youtu.be/JjhY2aFBTTk?t=971

[18] Часть 4: Инспектор и код-генератор: https://youtu.be/JjhY2aFBTTk?t=1423

[19] Часть 5: Playwright Tracing: https://youtu.be/JjhY2aFBTTk?t=1987

[20] Резюме: https://youtu.be/JjhY2aFBTTk?t=2548

[21] Q&A: https://youtu.be/JjhY2aFBTTk?t=2671

[22] библиотеку expect: https://jestjs.io/docs/expect

[23] с помощью удобных асинхронных сравнений: https://playwright.dev/docs/test-assertions

[24] page.locator(): https://playwright.dev/docs/api/class-page#page-locator

[25] page.goto(): https://playwright.dev/docs/api/class-page#page-goto

[26] page.click(): https://playwright.dev/docs/api/class-page#page-click

[27] Доступные утверждения в Playwright: https://playwright.dev/docs/test-assertions/

[28] pytest: https://docs.pytest.org/en/latest/explanation/fixtures.html#about-fixtures

[29] встроенных fixture: https://playwright.dev/docs/api/class-fixtures/

[30] fixtures.browser: https://playwright.dev/docs/api/class-fixtures#fixtures-browser

[31] fixtures.browserName: https://playwright.dev/docs/api/class-fixtures#fixtures-browser-name

[32] fixtures.context: https://playwright.dev/docs/api/class-fixtures#fixtures-context

[33] fixtures.page: https://playwright.dev/docs/api/class-fixtures#fixtures-page

[34] Test Fixture: https://playwright.dev/docs/test-fixtures/#test-fixtures

[35] Worker Fixtures: https://playwright.dev/docs/test-fixtures/#worker-fixtures

[36] test.beforeEach: https://playwright.dev/docs/api/class-test/#test-before-each

[37] test.beforeAll: https://playwright.dev/docs/api/class-test/#test-before-all

[38] test.afterAll: https://playwright.dev/docs/api/class-test/#test-after-all

[39] fixtures: https://aka.ms/playwright/fixtures

[40] Playwright Test API: https://playwright.dev/docs/api/class-test/

[41] Источник: https://habr.com/ru/post/645827/?utm_source=habrahabr&utm_medium=rss&utm_campaign=645827