Наш досвід переходу з Cypress на Playwright

Усі статті, обговорення, новини про тестування — в одному місці. Підписуйтеся на DOU | QA!

Як ми згадували в топіку з оновленнями Extensive-react-boilerplate, ми мігрували е2е-тестування з Cypress на Playwright. Прийшов час поговорити про це трішки детальніше.

На момент написання автотестів обʼєм функціонала, який треба було покрити, був невеликий. І при їх написанні використовуючи Cypress ми не стикалися із суттєвими обмеженнями.

То чому ж ми все-таки звернули увагу на Playwright? Причин декілька. Нам хотілося побачити, який фреймворк вдалося створити Microsoft та чому він набирає популярності. Також, як і у випадку з підтримкою Mongo DB, ми отримали запити від комʼюніті та колег, які б хотіли з різних причин стартувати проект на бойлерплейті саме з Playwright тестами.

Далі ми хочемо трішки поговорити про те, що нас зацікавило в процесі міграції тестів. Треба також відмітити, що так як обʼєм тестів був незначний, ми переписували тести вручну, щоб детальніше ознайомитись і заглибитись у новий фреймворк.

  • І починаємо ми з документації. Тут з впевненістю можна сказати — Cypress виносить Playwright в одні ворота. Документація Cypress дуже детальна та містить масу прикладів, навчальних матеріалів, а на гітхабі існує цілий проект з прикладами для кожної дії, яку можна виконати на середньостатистиному вебсайті. Сюди ж віднесемо комʼюніті, яка у Cypress все ще більша. Досвідчений розробник може скептично віднестися до цього пункту і скоріш за все йому достатньо буде інформації, яку дає Playwright в своїй документації, але спеціалісти з меншим досвідом отримають більше задоволення освоюючи Cypress ніж Playwright.
  • Продовжуємо роботу і переходимо до налаштування файла конфігурації. В нашому випадку ми не зустріли значних відмінностей. Нам знадобилось тільки налаштувати таймаути та базовий URL. З цікавого, які нові можливості дає нам тут Playwright:
    — він дає змогу налаштувати таймаут для кожного тесту включаючи тест та Before/After хуки
    timeout: 2 * 60 * 1000
    — також прямо в конфігурації є змога встановити на яких браузерах має виконуватись тестування. З відмінностей — Playwright підтримує WebKit на базі якого працює Apple Safari. Cypress такої підтримки не має.
    — перед виконанням тестів Playwright може стартувати локальний дев сервер з вашим проектом, це легко реалізується за допомогою параметра webServer
  webServer: {
command: process.env.CI
? "npm run build:e2e && npm run start"
: "npm run dev",
url: "<your url>",
reuseExistingServer: !process.env.CI,
},
  • Пишемо перший тест. Різниця в синтаксисі між двома фреймворками полягає в тому, що Cypress використовує ланцюжковий (chainable) синтаксис та має свою реалізацію асинхронності. Він не підтримує async / await синтаксис, а формує чергу з команд, які мають бути виконані. Це в свою чергу впливає на роботу зі змінними — для їх збереження має використовуватись команда .then(), яка схожа на promise, але не є такою. Playwright же підтримує стандарт ECMAScript 2015 (відомий як ES6) та працює зі зручною async / await конструкцією для асинхронних функцій.

Ось як виглядає код Playwright...

test("should be successful open page and check data is displayed", async ({
page,
}) => {
await page.getByTestId("profile-menu-item").click();
await page.getByTestId("user-profile").click();
await page.waitForURL(/\/profile/);
await expect(page.getByTestId("user-name")).toHaveText(
`${firstName} ${lastName}`
);
await expect(page.getByTestId("user-email")).toHaveText(email, {
ignoreCase: true,
});
await page.getByTestId("edit-profile").click();
await page.waitForURL(/\/profile\/edit/);
await expect(page.getByTestId("first-name").locator("input")).toHaveValue(
firstName
);
await expect(page.getByTestId("last-name").locator("input")).toHaveValue(
lastName
)

...та Cypress

  it("should be successful open page and check data is displayed", () => {
    cy.getBySel("PersonIcon").click();
    cy.getBySel("user-profile").click();
    cy.location("pathname").should("include", "/profile");
    cy.getBySel("user-name").should("contain.text", firstName + " " + lastName);
    cy.getBySel("user-email").should("contain.text", email);
    cy.getBySel("edit-profile").click();
    cy.location("pathname").should("include", "/profile/edit");
    cy.get('[data-testid="first-name"] input').should("contain.value", firstName);
    cy.get('[data-testid="last-name"] input').should("contain.value", lastName);
  });
  • Запускаємо виконання тестів. Тут варто сказати про архітектуру фреймворків. Cypress від інших фреймворків відрізняє те, що він виконує команди всередині браузера. І це дає йому легкий доступ до таких важливих компонентів як DOM, local storage, window обʼєктів і т.д.
    Playwright використовує архітектуру клієнт-сервер, та комунікує з браузерами через WebSocket зʼєднання.
  • Після того як переписали вже всі тести, запускаємо виконуватись всю папку. І одразу бачимо, що по дефолту тести запускаються паралельно. І якщо ви при написанні тестів не дотримались правила, за яким тести мають бути незалежними від результатів один одного, то тут самий час виправити цю помилку :)
    Це також одна з відмінностей між фреймворками — Playwright запускає тести паралельно одразу за замовчуванням і безкоштовно. Сypress виконує паралелізацію тільки для різних машин, і ця функція у ньому платна.
  • Коли всі тести виправлені і успішно виконуються ми звертаємо увагу на те, скільки часу займає їх виконання. І результат не на користь Cypress. Це обумовлено різною архітектурою фреймворків, про яку ми говорили вище.

Cypress. Тести виконуються за 3.82 хвилини

тести на Cypress

Playwright. Ті ж самі тести виконуються вже за 2.7 хвилин

тести на Playwright

Різниця складає 2,12 хвилини(у відсотках це 29,32%) на користь Playwright. У нас це зовсім невеликі цифри, але при збільшенні кількості тестів різниця буде тільки рости.

Мабуть, читаючи все вище написане, може виникнути питання, то чому ж ми все таки вирішили змінити фреймворк? Адже якихось суттєвих переваг ми не отрималина даний момент.

Так. Але ми звернулися до майбутнього нашого проекту та проектів, які будуть побудовані на основі бойлерплейтів з екосистеми bcboilerplates. І з цієї точки зору Playwright видався нам більш перспективним за Cypress. Паралелізація тестів, вища швидкість, можливість тестування мобільних додатків, можливість використання мов програмування крім JS та TS, а також те, що за Playwright стоїть такий великий гравець як Microsoft — все це зіграло на користь нового фреймворка.

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

1. cypress має експериментальну підтримку WebKit (Safari) (не перевіряв)
2. паралелізацію можна самому зробити (якщо не хо платити їм)
3. ви розглядаєте зміну мови у майбутньому? не впевнений що всі фішки підтримуються всіма лібами (тобто пайтон-плейрайт може не сапортити паралелізацію наприклад)
4. швидше... ну, «по-замовчуванню» так, але якщо паралельно пустити і сайпрес, то результати будуть іншими.
5. cypress теж може стартанути сервер, але так робити не рекомендують (антипаттерн)
Сподівався, що знайду реальні аргументи за плейврайт (сам варюся в сайпресі 5 років), але на такій малій вибірці тестів це тяжко проаналізувати, тому питання — нашо воно то все? :)

Ми не ставили собі задачу довести, що Playwright однозначно кращий інструмент ніж Cypress. Обидва можуть бути використані в залежності від задачі чи проекту.
Це просто наш невеличкий досвід дослідження фреймворку

чому ж ми все таки вирішили змінити фреймворк?
Паралелізація тестів, вища швидкість, можливість тестування мобільних додатків

То ваш невеличкий досвід, а це лише мій невеличкий коментар на уваги вказані в пості.

І ми вдячні Вам за зауваження) Але знов таки підкреслю, що це наш досвід дослідження, а не експертна стаття, де ми рекомендуємо щось читачеві. Як ми й вказали, Playwright видався нам більш перспективним по переліченим пунктам. Можливо ми помиляємося, час покаже

Плейрайт же наче не вміє тестування мобільних додатків.

Ви праві, як такого прямого тестування нативних мобільних додатків (наприклад, додатків на Android або iOS) немає. Але існує можливість тестування веб-додатків через емуляцію.
Ось що каже нам документація самого Playwright: “With Playwright you can test your app on any browser as well as emulate a real device such as a mobile phone or tablet. Simply configure the devices you would like to emulate and Playwright will simulate the browser behavior such as “userAgent”, “screenSize”, “viewport” and if it “hasTouch” enabled. You can also emulate the “geolocation”, “locale” and “timezone” for all tests or for a specific test as well as set the “permissions” to show notifications or change the “colorScheme”

Це в сайпресі теж є — в себе ми використовуємо його для тестів як десктоп так і мобайл розмірів екрану. При чому, емуляцією це не називають, аби не вносити недорозумінь :)

Ну так це ж просто зміна розміру браузера.

Так, а також додаткові «плюшки» у вигляді геолокації, таймзони і тд
Нажаль, поки не можемо розповісти як це виглядає на практиці, але обовʼязково перевіримо і розкажемо)

Підписатись на коментарі