Архитектура тестов или с чего вообще начать (тестировать JS на JAVA)

Привет, форумчане!

У меня задача поднять GUI тесты для ежедневного смоука на проде с нуля. Подключить к CI.

Перечислю проблемы и нестыковки, которые есть. Я писала на java, потом дооооолгий перерыв в работе, теперь снова пишу. Морда приложения на Angular. Писать на java/python - прерогатива руководства и собственно критерий моего выхода на данную позицию (про JS не акцентировали во время интервью). Понимаю, что лучше бы писать тесты на языке приложения, но такой возможности нет (у меня нет желания лезть в js, лучше прокачаться как гуру java и перейти на серверные тесты). Сервер как раз на java, но пока передо мной стоит другая задача, автоматизация ежедневной ручной рутины

Мое видение ситуации такое:
использовать связку ngWebdriver, java, Selenide, Junit 5. Для пачки тестов в количестве 30 -40 шт вполне (покрытие позитивных сценариев)

Кто-то работает с такой связкой? Все инструемнты совместимы? Какие грабли словлю? Все ли удастся покрыть или что-то неоправданно сложно реализуемо?

Вычитала про инструемнт PlayWright, возможно ли его использование в таком бэкграунде? Есть у кого-то опыт?

Надо ли запускать UI тесты изолированно, поднимая локально все окружение? Или можно на рабочих серверах? Собиралась на рабочих, но разговор с разработчиком заставил сомневаться

Ну и покидайте пожалуйста свое видение ситуации. Подискутировать мне на эту тему особенно не с кем.

– Этого будет достаточно.
Тесты запускать надо на отдельной машине, специально выделенной под автотесты. Для начала можно запускать тесты и локально, потом можно сделать запуск тестов прямо на машине с Дженкинсом, если она толстая и мощная.

Пока не совсем разобралась, как Selenide работает с Angular? Может вам попадались на гитхабе примеры? Я нашла только с ngWebdriver, но он не запускается с последними версиями инструментов, думаю конкретно с Junit5

Для начала можно запускать тесты и локально, потом можно сделать запуск тестов прямо на машине с Дженкинсом, если она толстая и мощная.

На проекте тим сити, сервер без GUI. Я так понимаю надо будет распаковать там утилиту вроде xvfb? Или что сейчас бесплатное/популярное?

Кстати вопрос, надо ли складывать UI тесты в контейнер или возможно гонять на реальном сервере?

Селенид работает с браузером, не важно какое приложение в нём.

Запускайте тесты в хеадлесс режиме - и не надо ничего устанавливать будет.

Не думаю, что вам надо так глубоко пока что погружаться в эти вопросы.

Селенид работает с браузером, не важно какое приложение в нём.
С чего начать?
Понимаю. Однако как привязываться к локатором такого плана, которые динамически меняются?

<input _ngcontent-gin-c198="" formcontrolname="chip" class="mat-chip-input mat-input-element mat-autocomplete-trigger ng-pristine ng-valid ng-touched" id="mat-chip-list-input-0" autocomplete="off" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-haspopup="true">

тут id из готовой библиотеки, меняется при переключении режима, вовзрате для эдита и тд?

Смотреть на другие атрибуты элемента.

Спасибо!
Может еще будут другие идеи? Подожду остальных форумчан

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

для повышения тестабилити приложения идите к фронтендерам и просите у них кастомные айдишники в html коде типо test-id=dropdown

а лучше просите доступ к редактированию кода и сами себе эти айдишники проставляйте (спросите у разработчиков как это сделать, чтоб не сломать вёрстку, и далее сами себе упрощайте процесс)

6 лайков

спасибо, звучит неплохо!

Работаю с этой связкой около 5 лет - всё прекрасно. Тесты можно запускать используя Selenoid.
Про айдишники вам уже сказали.

3 лайка

вдогонку - я написал в свое время GitHub - sergueik/jProtractor: An AngularJS/Protractor implementation for Java Selenium API
он то же что ngwebdriver отличия только во внутренней организации фасадов и адаптеров

если выяснится что надо что то добавить обрашайтесь

ангулар js однозначно лучше намного тестировать через протрактор клоны а не напрямую

1 лайк

Хотел что-то написать, но все в принципе уже написали. На Java это JUnit 5 (или TestNG) и Selenide. Запускать с Selenoid. В плане айдишников и особенностей Angular - советуйтесь с фронтендерами.
Насчет Playwright ничего не могу сказать, не использовал. Java API у него выглядит вполне адекватно. По декларируемым возможностям - тоже норм, если хотите рискнуть - можете попробовать на нем.

Добрый вечер.
Мы на проекте используем Java + PlayWrtight + Junit5 + AssertJ + Gradle + Allure - это из основных инструментов.
При использование PlayWrtight тесты бегут быстрее чем использовать Selenium или Selenide, PlayWrtight не использует http запросы к браузеру, а работает через WebSockets это значительно ускоряет тесты.
Используем Moon(в коробке использует Selenoid) где CI запускает тесты в клауде.
Moon - можно развернуть в клауде, почитайте.
Moon - платный но можно использовать до 4 параллельных сессий бесплатно, нам как раз хватает.
Как пример 300 UI тестов в двух потоках дают 35-40 минут.
На данный момент PlayWrtight работает стабильно.

Как то так.

2 лайка

У меня был доклад на Гейзенбаге 2021 на тему автоматизации с нуля до CI. Правда, для мобилок, но Appium и Selenium, как и Kotlin c Java по сути одно и тоже. UI Автоматизация тестирования мобильных приложений - Google Slides

Может, найдете что-то полезное =)

1 лайк

я бы все же посмотрел в сторону связки typescript + playwright, объясню почему: мало иметь только UI смоук тесты, лучше построить всю TA пирамиду Unit/Integration/E2E тестов и иметь все эти тесты в том же репозитории, где и код фронтенда. тогда при сборке билда допустим сначала упадут юнит тесты, если они успешны то упадут интерграционные (предполагается что бэкенд в другом проекте и он уже развернут), если используют для обращений к бэкенду те же клиентские классы что и код фронтенда, и весь этот фидбек будет получен еще до того как мы еще даже не начали поднимать локально фронтенд для смоук тестов.
по поводу playwright: я сам раньше писал на java/selenium, сейчас перешел на ts/playwright, многие вещи удобнее и проще прямо из коробки, например expect использует встроенный waiter если ему передать локатор, то есть можно писать что-то типа
await expect(page.locator('h2')).hasTextContent('Hello') и он будет ждать что элемент появится, станет видимым и в него подгрузится нужный текст. или например можно подменять ответы от бэкенда на лету если нет возможности получить нужный ответ от бэкенда

звучит прям очень хорошо

это еще не все, для expect можно определять свои матчеры если готовых не хватает, и они так же будут работать через waiter: await expect(page.locator('h2')).hasTextContentIgnoringShySpaces('Rechtsschutzversicherungsgesellschaften ')

1 лайк

Playwright + JS, typescript работает вообще отлично, + есть плюшки что не доступны в Java Client.
Тут уже больше самому автору решать что ближе и вообще готов ли автор по пробовать что то новое типа Playwright или все же остаться на Selenium/Selenida.

1 лайк

Для Angular можно использовать Component Object подход. Если в UI используют +/- 30 компонентов, можно написать класс на каждый и строить Page Object просто декларируя компоненты. Обращаясь к компоненту страницы, вы получаете все релевантные методы взаимодействия. В конструкторе компонента нужно искать родительский html елемент и все методы класса будут использовать его, как ноду для поиска внутри. При таком подходе вся логика взаимодействия с UI в нескольких классах, а локаторы максимально простые. Можно быстро и без боли переходить между библиотеками Selenium и Selenide к примеру.

3 лайка

Спасибо, прийму к сведению!