Автоматизация тестирования на Node.JS
Введение
В этой статье пойдет речь про использование Selenium-Webdriver — это инструмент для автоматизации действий веб-браузера на платформе Node.JS.
На одном из проектов перед нами была поставлена задача — выполнить разработку Web UI автотестов. Одним из пожеланий являлось — запуск тестов на стороне frontend разработчиков с использованием возможностей только Node.JS, без использования сторонних приложений.
Исторически сложилось, что для автоматизации тестирования долгое время эталоном считались Java и Python. Поэтому, если провести опрос среди автоматизаторов, то с большой долей вероятности они выберут один из этих языков программирования.
Почему данная статья важна? Ведь в интернете можно найти множество статей и примеров по тому, как можно реализовать UI тесты с использованием Selenium-js. Однако при их детальном изучении оказывается, что примеры в них приводятся достаточно простые, а вот примеры с использованием PageObject модели найти гораздо сложнее. Поэтому, если хочется узнать немного больше, то поехали.
О трудностях выбора
Ключевое требование, которое стояло перед нами, это то, что автотесты должны быть написаны на Node.JS. Всё остальное можно было выбирать в широких пределах. Первым выбором на непростом пути автоматизации оказался выбор тестового фреймворка.
Mocha
Для Node.JS написано огромное количество библиотек, поэтому, для того чтобы не потеряться в этом многообразии, мы выделили для себя несколько фреймворков:
- Cucumber — популярный open-source BDD фреймворк, в котором для реализации тестов используется язык Gherkin.
- Jasmine — популярный BDD фреймворк для тестирования JS.
- Mocha — это JS-фреймворк, облегчающий тестирование асинхронного кода в Node.JS модуле или браузерном приложении. Тесты в Mocha имеют улучшенное качество трассировки исключений и могут прогоняться сериями.
- Protractor — популярный E2E Angular фреймворк, основанный на WebDriverJS.
Опыт работы с Java в данной области подталкивал нас искать похожее решение на JS, и мы выбрали Mocha. Поэтому было принято решение отказаться от других более экзотических фреймворков.
Используя Mocha, мы получаем необходимый минимум и ничего лишнего. Ну а кроме этого, Mocha — это один из популярнейших фреймворков на Node.JS с достаточно активным сообществом и большим количеством документации. Но при всех достоинствах у него есть и недостаток — это отсутствие assert-ов.
Поэтому для проверок было решено использовать стороннюю библиотеку Chai. Подключение несложное — нужно ввести всего одну строку, а бонусом к этому будет возможность использовать любой из стилей assertions: assert, expect, should.
Selenium-webdriver
Так как на этапе выбора фреймворка мы отказались от Protractor, далее предстояло выбрать “механизм общения” тестов с браузером. И тут тоже JavaScript может похвастаться разнообразием, вот самые основные кандидаты:
- Selenium-webdriver — классический Selenium на JS.
- WebdriverIO — по сути высокоуровневая обёртка над Selenium-webdriver.
- Nightwatch.js — предоставляет отдельный фреймворк для тестирования, в котором есть все необходимые инструменты: сервер, assert-ы и т.д. При этом его можно использовать как полностью самостоятельное решение, так и в составе с различными решениями.
Выбор пал на Selenium-webdriver, так как это классическое решение для данной задачи, приёмы работы с которым практически не отличаются от приёмов в Selenium на Java.
Примеры кода
В данном разделе будут приведены образцы кода, выполненного на заданных технологиях.
BaseDialog
Данный класс является частью PageObject модели тестируемого приложения. В нём описана базовая функциональность для любого диалогового окна тестируемого приложения. Также данный класс наследуется от BasePage, в котором описана вся базовая функциональность по работе с любыми web-элементами. Каждый web-элемент, с которым мы хотим взаимодействовать в тестируемом приложении, должен быть отражен в данной модели (страницы, вкладки, диалоги кнопки и т.д.).
SaveDialog
Данный класс также является частью PageObject, он реализует базовый класс BaseDialog. Как видно из скрина, в новом диалоге добавлена обработка ещё одной кнопки “Save”.
Базовый класс диалогов BaseDialog имеет множество реализаций (например: диалог ошибки, диалог удаления и т.д.).
BaseSteps
На этом скриншоте мы видим часть класса BaseSteps. Данный класс содержит набор общих методов, которые понадобятся для реализации любого сценария (например: логин в приложение, логаут и т.д.). Класс является основой слоя степов.
Частные случаи степов наследуются от этого класса, таким образом слой степов также представляет собой отдельную ООП модель.
TestExample
Здесь можно оценить примерный вид обычного теста выполненного с использованием PageObject.
Как видно на скриншоте, сам тест очень компактный. В нём чётко видны входные параметры, некое действие с ними, и в завершении одна контрольная проверка того, что данные сформированы верно.
Выводы
Можно ли использовать для web UI тестирования инструменты Node.JS? Конечно можно, но нужно быть готовым к различного рода трудностям, таким как:
- Асинхронность — можно сказать, что методы в тесте бегут впереди паровоза и проверяют ваши данные до того как вы их ввели. Решается достаточно просто — необходимо просто привыкнуть.
- Ограниченная поддержка ООП в JS — периодически приходится танцевать с бубном, потому что у одного из объектов не видно методов.
- Из-за проблем с построением ООП моделей непросто было добиться корректной работы PageObject модели.
- Хотя в mocha есть возможность работы с тегами, но гибкости не так много, как хочется. Это вопрос не ко всему JS, а только к фреймворку.
А вот перечень преимуществ, которые мы получили при данном подходе:
- Весь код может находиться в одном репозитории, а для запуска тестов разработчиками не потребуется ставить дополнительные инструменты, такие как Python или Java.
- При необходимости использования каких-то функций из приложения их подключение может оказаться достаточно простым действием.
- Упрощается взаимодействие между командой разработчиков и тестировщиков, при необходимости разработчики могут подключаться к реализации тестов.
Полезные ссылки
- Перевод статьи с инструментами для тестирования проектов, основанных на JavaScript — https://habr.com/ru/company/ruvds/blog/349452/
- Официальный сайт Cucumber — https://docs.cucumber.io/
- Официальная страница фреймворка Mocha — https://mochajs.org/
- Сайт assert библиотеки Chai — https://www.chaijs.com/