Architecture Decision Record

Active theme: Light

← Приклади записів рішень

Запис архітектурного рішення: фреймворк автоматизації браузера для E2E-тестування (Playwright чи Selenium)

1. Контекст

Ми обираємо фреймворк автоматизації браузера для нашого конвеєра наскрізного (end-to-end, E2E) тестування. Цей фреймворк буде невід’ємною частиною наших процесів CI/CD, виконуючи тести, що імітують реальну взаємодію користувачів із нашою платформою. Зокрема, тести охоплюватимуть такі сценарії, як реєстрація/вхід користувача, завантаження файлів, взаємодія з дашбордами та завантаження звітів.

Як стартап, ми зосереджені на гнучкій розробці (agile) і потребуємо швидко ітерувати й розвиватися. Наша команда переважно працює з TypeScript і Python, тому можливість писати тести цими мовами є обов’язковою. Крім того, платформа містить інтерактивні діаграми та дашборди, тож критично важливо, щоб інструмент автоматизації добре підтримував насичені динамічні інтерфейси.

Двоє претендентів на це завдання — Playwright і Selenium, кожен із власними сильними сторонами та компромісами. Нам потрібно оцінити ці фреймворки на основі наведених нижче можливостей і вимог.

2. Розглянуті варіанти

  • Playwright (від Microsoft)
  • Selenium (від проєкту Selenium)

3. Чинники рішення

На наше рішення впливають такі чинники:

  1. Гнучка розробка: обраний інструмент має забезпечувати швидкі й гнучкі цикли розробки.
  2. Підтримка мов: нашій команді потрібна підтримка і TypeScript, і Python.
  3. Тестування інтерактивного інтерфейсу: обов’язкова можливість надійно тестувати інтерактивні діаграми, дашборди та динамічні елементи.
  4. Швидкість виконання: хоча це не головна турбота, продуктивність у конвеєрах CI/CD береться до уваги.
  5. Масштабованість: ми не плануємо масового масштабування найближчим часом, але хочемо переконатися, що рішення впорається з майбутнім зростанням.
  6. Зворотна сумісність: застарілі системи та сумісність зі старішими браузерами наразі не критичні для нашого проєкту.
  7. Тестування мобільних пристроїв: хоча це не найближчий фокус, фреймворк має вміти тестувати мобільні адаптивні функції або бути розширюваним для таких випадків.
  8. Тестування на кількох моніторах: підтримка конфігурацій із кількома моніторами — другорядна вимога, особливо якщо ми колись масштабуватимемося до тестування складніших робочих процесів користувачів.
  9. Тестування завантаження файлів: фреймворк має ефективно обробляти завантаження файлів — це основна вимога наших потреб у тестуванні.

4. Критерії оцінювання

  • Простота використання: наскільки легко писати й підтримувати тести?
  • Підтримка мов: чи підтримує фреймворк TypeScript і Python — дві мови, якими наша команда користується найчастіше?
  • Тестування інтерактивного інтерфейсу: наскільки добре фреймворк обробляє складні інтерактивні інтерфейси користувача, такі як діаграми, завантаження файлів і динамічні дані?
  • Інтеграція з CI/CD: наскільки добре фреймворк інтегрується зі стандартними інструментами та сервісами CI/CD?
  • Підтримка різних браузерів: які браузери підтримуються і наскільки добре вони працюють?
  • Продуктивність і швидкість: як швидко виконуються тести, особливо в конвеєрі CI/CD?
  • Масштабованість: наскільки добре фреймворк масштабується, якщо додаватимуться нові тести чи складніші сценарії?
  • Спільнота й екосистема: наскільки активна спільнота фреймворку? Чи є багато інтеграцій і розширень?

5. Міркування

5.1 Playwright

Переваги:
  1. Розумніший API для завантаження локальних файлів: API Playwright для роботи з локальними файлами та виконання завантаження файлів простіший і інтуїтивніший. Це полегшило б реалізацію та супровід тестів завантаження файлів.
  2. Синтаксис і генерація коду: Playwright має коротший і лаконічніший синтаксис. Це дає менше шаблонного коду, що покращує супровідність і ефективність розробників. Крім того, коротший синтаксис підвищує якість генерації коду за допомогою OpenAI, полегшуючи автоматичне створення тестових скриптів.
  3. Тестування інтерактивного інтерфейсу: Playwright чудово тестує динамічні інтерактивні вебзастосунки, наприклад із насиченими діаграмами, складною взаємодією з користувачем і оновленнями в реальному часі. Він дуже ефективно працює з WebSockets, WebRTC, shadow DOM та іншими сучасними вебтехнологіями.
  4. Підтримка різних браузерів: Playwright підтримує Chromium, WebKit і Firefox. Він працює стабільно в цих браузерах, що має покрити більшість наших потреб у тестуванні.
  5. Інтеграція з CI/CD: Playwright безшовно інтегрується із сучасними платформами CI/CD (GitHub Actions, Jenkins тощо). Він може запускати тести паралельно в різних браузерах, оптимізуючи час виконання тестів і роблячи його придатним для швидкої розробки.
  6. Швидкий і надійний: Playwright загалом швидший за Selenium, особливо в режимі без графічного інтерфейсу (headless), і стійкіший у роботі з асинхронними вебелементами.
Недоліки:
  1. Обмежене тестування мобільних пристроїв: хоча Playwright підтримує мобільну емуляцію для браузерів, у нього немає вбудованих можливостей тестування мобільних пристроїв, як-от інтеграція Selenium з Appium для справжнього мобільного тестування.
  2. Менша екосистема: Playwright ще новіший і менш усталений, ніж Selenium. Хоча він має спільноту, що швидко зростає, і добру документацію, у нього, можливо, ще немає такої величезної екосистеми плагінів та інтеграцій, яку пропонує Selenium.
  3. Обмежена підтримка браузерів: хоча Playwright охоплює основні сучасні браузери (Chrome, Safari, Firefox), його підтримка застарілих браузерів (напр., Internet Explorer) не така надійна, як у Selenium.

5.2 Selenium

Переваги:
  1. Довша історія та зрілість: Selenium існує вже давно й має підтверджений послужний список. Його широко використовують численні команди та галузі, що призвело до величезної екосистеми плагінів, інтеграцій і ресурсів.
  2. Підтримка різних браузерів і платформ: Selenium підтримує широкий спектр браузерів і версій, включно з Internet Explorer, а також може інтегруватися з різними інструментами, як-от Docker, Selenium Grid і хмарні сервіси, для розподіленого тестування.
  3. Тестування мобільних пристроїв: Selenium завдяки інтеграції з Appium значно надійніший для мобільного тестування, зокрема застосунків Android та iOS. Це робить його кращим вибором для проєктів із мобільним пріоритетом або значним мобільним навантаженням.
  4. Тестування на кількох моніторах: Selenium краще підтримує сценарії з кількома моніторами або складною взаємодією між кількома вікнами.
Недоліки:
  1. Складність: API Selenium багатослівніший і явніший. Хоча в деяких випадках це може бути перевагою, це означає більше коду для написання й супроводу, що може знизити гнучкість розробників — а це особливо важливо в середовищі стартапу.
  2. Продуктивність: Selenium загалом працює повільніше за Playwright, особливо в режимі headless. Це могло б вплинути на конвеєри CI/CD, особливо зі зростанням кількості тестів.
  3. Тестування інтерактивного інтерфейсу: Selenium не такий гладкий, як Playwright, у тестуванні сучасних інтерактивних вебінтерфейсів, особливо з діаграмами та оновленнями даних у реальному часі. Для надійної взаємодії з динамічним вмістом потрібно більше налаштувань і обробки.

6. Підсумок порівняння

Можливість Playwright Selenium
Простота використання Коротший синтаксис, інтуїтивніший для сучасних інтерфейсів Явніший, потребує більше шаблонного коду
Підтримка мов TypeScript, Python, JavaScript TypeScript, Python, Java, Ruby, C#
Тестування інтерактивного інтерфейсу Чудово для динамічних інтерфейсів реального часу Обробляє прості інтерфейси, але багатослівніший і складніший для насиченої взаємодії
Тестування завантаження файлів Розумніший API для завантаження файлів Багатослівніший, менш інтуїтивний API
Інтеграція з CI/CD Проста інтеграція з GitHub Actions, Jenkins Сильна інтеграція з багатьма інструментами CI
Тестування мобільних пристроїв Обмежене, лише емуляція Повна підтримка через Appium
Підтримка різних браузерів Chromium, WebKit, Firefox Повна підтримка основних і застарілих браузерів
Продуктивність Швидкий, оптимізований для тестування headless Повільніший, особливо в режимі headless
Тестування на кількох моніторах Обмежене Добра підтримка конфігурацій із кількома моніторами
Спільнота й екосистема Зростає, добра документація Велика, зріла, розлога екосистема

7. Рішення

Зваживши вимоги та компроміси, Playwright — кращий вибір для наших поточних потреб. Його розумніший API для тестування завантаження локальних файлів, лаконічний синтаксис і сильна підтримка тестування інтерактивного інтерфейсу роблять його ідеальним для нашого циклу гнучкої розробки. Той факт, що він підтримує і TypeScript, і Python, критично важливий для нашої команди, а сучасний підхід фреймворку до тестування дозволить нам писати чистий, супровідний код.

Хоча Selenium лишається чудовим інструментом, особливо для тестування мобільних пристроїв, підтримки застарілих браузерів і конфігурацій із кількома моніторами, він менш придатний для наших поточних потреб. Його багатослівність, повільніша продуктивність і складніша робота з динамічними інтерфейсами, як-от діаграми, роблять його менш оптимальним для нашого випадку.

8. Наслідки

  • Негайні дії: ми впровадимо Playwright для нашого E2E-тестування, зосередившись на тестуванні користувацьких потоків, що охоплюють реєстрацію, вхід, завантаження файлів, дашборди та завантаження звітів.
  • Довгострокові міркування: ми стежитимемо за розвитком екосистеми Playwright. Якщо наші потреби зміняться, особливо щодо тестування мобільних пристроїв чи підтримки застарілих браузерів, ми можемо повернутися до Selenium.
  • Навчання та документація: команди розробників мають ознайомитися з API Playwright, особливо для роботи з динамічними інтерфейсами та завантаженням файлів.
  • Міграція: наявні тести Selenium (якщо такі є) поступово мігрують на Playwright.

9. Майбутні міркування