Разделы портала

Онлайн-тренинги

.
От "так себе" до "отлично": мой опыт браузерного тестирования с NodeJS с 2015 года
18.08.2021 00:00

Автор: Джош Грант (Josh Grant)
Оригинал статьи
Перевод: Ольга Алифанова

За несколько лет многое может измениться – взглянуть хоть на состояние дел с тест-автоматизацией на JavaScript (JS).

Если бы вы спросили о моем мнении по поводу JS и браузерного тестирования в 2015 году, я бы сказал "избегайте JS как только можете, но если уж вам необходимо использовать JS – применяйте Protractor".

Теперь моя позиция поменялась на 180 градусов: "WebdriverIO – наилучший выбор для браузерной (и мобильной) тест-автоматизации UI, и я настоятельно рекомендую инструменты на основе JS, а не инструменты на основе Java".

(если вы думаете "А где, по вашему мнению, JS-инструменты автоматизации окажутся к 2026 году?", то мой ответ – "Ни малейшего понятия").

Думаю, полезно будет поразмышлять, почему моя позиция так изменилась – это поможет понять современное состояние не только инструментов на основе JS, но также и инструментов браузерной автоматизации в целом. И не только это – JS-инструменты сейчас применяются и за пределами JS-проектов и организаций, а Playwright стал мультиязычным, начав с JS. Тест-инструменты на JS не только выжили, но и процветают.

Начнем с того, что в 2015 году Angular был писком моды в мире фронт-эндных JS-фреймворков. React только вышел, а до инструментов вроде VueJS и Svelte было еще жить и жить. Angular был сильно на слуху и активно использовался, и, естественным образом, к идущему с ним тест-фреймворку тоже относились с пристальным вниманием. Проект Angular считал (совершенно справедливо) браузерное тестирование элитным жителем своей экосистемы, и вкладывал достаточные ресурсы для поддержания Protractor в форме. У самого Protractor есть как минимум один разработчик в Google, занимающийся исключительно им, а также живой GitHub с открывающимися и закрывающимися вопросами и багами.

JS в те времена тоже кардинально отличался от своего нынешнего состояния. Промисы встраивались напрямую в NodeJS: API асинхронности было лучше для работы, чем коллбэки функций. До классов ES6 оставалось еще несколько лет, и даже npm-скрипты применялись не так часто. Все эти функции (или их отсутствие) у NodeJS также помогали повысить интерес к Protractor среди сообщества разработчиков и тестировщиков. Так как Protractor использовал WebdriverJS, языковые JS-связи, предоставляемые проектом Selenium, а WebdriverJS использовал промисы, код Protractor был идиоматическим и "стандартным" для NodeJS в 2015 году.

Несмотря на все вышесказанное, JS был асинхронным языком. Так как практически все браузерные автотесты предназначались для синхронного запуска, изучение синтаксиса и семантики промисов было дополнительным нетривиальным шагом к созданию хороших Protractor-тестов. К тому же создание Page Objects было сложной задачей в условиях языка, не имеющего концепции объектов на основе классов. Создание хороших тестов Protractor было связано со значительными издержками по сравнению с Java или Python. Схожие проекты для браузерных тестов в NodeJS варьировали от недостаточно зрелых (WebdriverIO) до практически непригодных к использованию (NightwatchJS) – в основном потому, что эти проекты тоже были довольно молоды. Добросим тот факт, что Protractor был специфичен для Angular, а инструментарий Node был недоразвит по сравнению с Java (помните Grunt для запуска?) – и очевидно, что выбор Java вместо (к примеру) Protractor был довольно очевиден.

Перепрыгнем в 2021.

Мир изменился, и вместе с ним изменился серверный JS. Теперь объектно-ориентированное программирование на основе классов возможно и в JS, а определение и запуск скриптов из package.json – стандартная практика. Серверный JavaScript – как сам язык, так и его инструменты – очень быстро возмужал. Теперь создание поддерживаемых масштабируемых баз в основном синхронного кода (включая тест-проекты) вполне возможно на NodeJS. К тому же зрелость инструментов вроде WebdriverIO и NightwatchJS тоже возросла. Появилась даже новая категория инструментов, вообще не применяющих Selenium и использующих клиентские JS-биндинги или W3C-протокол – это Cypress, Playwright, TestCafe. Для желающих писать браузерные тесты на JS накрыт огромный шведский стол.

И, по моему мнению, лучший из этих инструментов – это WebdriverIO, и вот почему:

  • У него устойчивая экосистема служб и плагинов, позволяющая командам выбирать нужную им функциональность,
  • У него активное сообщество, где можно найти ответ на свой вопрос, обсудить фичи и получить помощь по работе с инструментом,
  • У него хорошо продуманный API и инструментарий, что позволяет разным тестам и структурам пользоваться одним и тем же кодом.

В целом WebdriverIO не только (по моему мнению) лучший инструмент в мире NodeJS – это, возможно, лучший в целом выбор для команд, начинающих работать с браузерной (или мобильной) автоматизацией.

Тем временем жизнь Protractor подходит к концу. Для некоторых это неудивительно. Баги и проблемы Protractor постепенно накапливались несколько лет, а количество участников и инженеров Google все сокращалось. Использование WebdriverJS и отсутствие капсулирования асинхронности от конечных пользователей оказалось ошибкой, а специфичные для Angular функции были удалены или потеряли ценность для разработчиков. И, наконец, проект Angular объявил, что поддержка Protractor прекратится после выхода Angular 15. Лучший JS-инструмент моих безмятежных дней тест-разработки перестанет существовать.

Вспоминается цитата "Постоянны только перемены". Мне кажется, это полностью применимо к миру инструментария NodeJS.

Обсудить в форуме