Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Добавление Listener BrowserPerClass в базовый класс


(Vasiliy Rakshin) #1

Проект выглядит так:
Базовый для тестов класс (где прописаны всякие бефоре и афтер класс и сьют методы).
От него наследуются уже все другие классы с кучей мелких тестов (@Test) в каждом.
Добавил @Listeners({BrowserPerClass.class}) в свой базовый класс.
Насколько я понимаю, браузер должен использоваться 1 и не закрываться между тестами 1 класса. А в реальности не получается - браузер закрывается и открывается новый между тестами.
В консоли это:
com.codeborne.selenide.impl.WebDriverThreadLocalContainer closeUnusedWebdrivers

Может ещё надо какую-нить переменную в окружение добавить или на что ещё смотрится (может, я наоборот что-то включаю ненужное для этой ситуации)?
На описание наткнулся тут: http://selenide.org/javadoc/2.25/com/codeborne/selenide/testng/BrowserPerClass.html
TestNG - 6.8.21 Селенид - 2.24


(asolntsev) #2

Фича “closeUnusedWebdrivers” появилась не так давно - это она закрывает браузер. Закрывает потому, что поток, в котором браузер был открыт, больше неактивен.
В общем, покажите Ваш суперкласс - все листенеры и before/after-методы


(Vasiliy Rakshin) #3

https://gist.github.com/anonymous/0069c410f34e8a856ddf - базовый класс
https://gist.github.com/anonymous/8956ddb7c3a281366bc1 - листенер что подключается к testNG
https://gist.github.com/anonymous/85a800635ae0201f9f7e - аллюровский листенер

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


(Sergey Pirogov) #4

Шо за аннотация скиньте ссылку на док?


(Vasiliy Rakshin) #5

В первом сообщении ссылка же.


(Vasiliy Rakshin) #6

Попробовал совсем голые классы.
Суперкласс - только листенер BrowserPerClass и пустое содержание.
В другом пакете класс с тестами, без всяких свистоперделок - браузер перезакрывается между тестами.


(Vasiliy Rakshin) #7

Нашел в чём проблема.
У меня у каждого теста в аннотации есть timeOut (в моём 3 ответе в 4 ссылке, пример теста). Вот если её не указывать, то тесты работают в одном браузере. Андрей это баг или фича?


(asolntsev) #8

Точно, я же знал это, не в первый раз нарываюсь. :frowning:

Дело в том, что TestNG запускает тесты в разных потоках, когда задан параметр timeOut.
А Selenide привязывает вебдрайвер к потоку. Типа, в одном потоке работает один вебдрайвер. Другой поток - другой вебдрайвер. Я пока не придумал, как с этим бороться, да и надо ли?

Но кстати, что я могу сделать - это встроить в Selenide возможность проще задавать timeout, так чтобы тесты бегали в одном потоке. Мы так в нашем рабочем проекте делаем. У нас тесты бегут в одном потоке, а вот “следилка за временем” бежит в отдельном потоке.


(Vasiliy Rakshin) #9

Т.е. ты сделаешь типа новой селенидовской аннотации, что будем добавлять для каждого теста? Хорошо, это нужно. Буду следить за релизами (хотя, и так слежу))).


(asolntsev) #10

Да, аннотацию для TestNG.
Надо будет добавить листенер в общий класс и аннотацию типа @Timeout(“5s”) к каждому тестовому методу.

Хотя у нас сетап проще. У отдельных методов таймаута нет, но есть общий таймаут на все тесты - 1.5 минуты. И нужен он в первую очередь для того, чтобы обрубать тесты, когда chromedriver завис.

Кстати, а зачем вам нужен таймаут?


(Vasiliy Rakshin) #11

В основном, если тест зависает, то да, перезакрывать браузер. Сами тесты есть маленькие, выполняются по минуте-две, на них же некошерно же вешать общее ожидание, например 30 минут (максимальное время выполнения самого длинного теста). Вот и описываем, чтобы если что быстрее отрабатывало, для коротких тестов - маленькое значение, для длинных - большое. т.е. ограничивать все тесты 1 таймаутом негибко и контрпродуктивно))


(asolntsev) #12

Чито? 30 минут???
И этот человек говорит с нами за контрпродуктивность… :slight_smile:

А если серьёзно, что можно делать 30 минут? Это просто в голове не укладывается.
у нас самый долгий тест работает 15 секунд.


(Vasiliy Rakshin) #13

Слово “например” видели? )) Обсуждать время выполнения тестов не будем, это не относится к делу.


(asolntsev) #14

Ну ладно, я же не со зла :smile:
На самом деле относится. Если максимальное время выполнения теста относительное небольшое (скажем, 15 секунд), то можно поставить один общий таймаут. Такое решение на порядок проще.

А вот сделать отдельный таймаут для каждого теста, боюсь, у меня не получится проще, чем в TestNG. Поэтому предлагаю простое и надёжное решение.