TestNG отладка кода. Остановка выполнения на первой строке

java
testng
Теги: #<Tag:0x00007fedbc621db0> #<Tag:0x00007fedbc621888>

(Buba) #1

Всем привет!

Хотел узнать про откладку в TestNG. Интересует, скажем так, первая обрабатываемая строка в коде. При наличии метода main это понятно, а с testng не совсем. Вопросы следующие:

  1. Если я использую @BeforeClass (без листенеров), то с этого и начинается выполнение шагов?
  2. Как остановить дебаггер на первой строке без использования breakpoints? Есть ли аналогии ‘stop in main’ для testng?

Большое спасибо за помощь.


(Sergey Korol) #2

Уж поверьте, “первая обрабатываемая строка в коде” вас точно не интересует. Есть вещи, о существовании которых вы даже не подозреваете на текущем этапе вашего обучения основам.

Тут следовало бы уточнить, о каких шагах идет речь. Ну и вряд ли вы тут найдете свободных экстрасенсов, которые смогли бы ответить на этот вопрос, не глядя в код (полную версию).

Отладка предполагает, что программист знает (хотя бы приблизительно), что и где он хочет проанализировать во время выполнения. Для этого и ставятся breakpoints. Но если вы и сами не знаете, чего хотите, как IDE сможет за вас это определить?

Вы задаете неправильные вопросы. Попробуйте сформулировать конечную цель. Что именно вы хотите продебажить? Зачем вам понадобилась первая строка?


(Buba) #3

Сергей, большое спасибо за ответ!
Расскажу поподробнее.
Такое внимание к первой строке в связи с тем, что сейчас анализирую готовый проект автоматизированного тестирования, в котором сложная реализация конфигурации при запуске тестов. Интересует вызываемая первая строка, написанная именно программистом автотестов, а не внутренние системные вещи.
Все таки думаю что бывают такие случаи когда программист анализирует чужой код, и требуются понять откуда и что сначала вызывается, когда это не так явно в коде. Поэтому, полагаю, в ide и реализован, как уже указывал, флаг “stop in main” для пошагового анализа выполнения программы с самого начала. Вот ищу аналоги для testng когда отсутствует метод main.
Хотелось бы наверное точно узнать про последовательность и приоритетность при вызове - метки Before листенеры и т.д, что перед чем вызывается. Куда лучше ставить breakpoint, чтобы постараться попасть в самое начало, если нет специальных надстроек в ide/плагинах.


(t62) #4

Могу Вас уверить что если в проекте нет этих строк:
TestNG test = new TestNG(true);
test.setTestClasses(new Class[]{cl});
test.run();

то концов вы не найдёте, тоесть в данном случае TestNG специально вскарлюю нужный клас для тестирования, а в инном, это на пример на папке или класе нажать правой кнопкой и выбрать запустить на тест, то там срабатывает совсем другая логика запуска, начиная от static{} и сканирование запущеного на тест класса, то смыска искать корни нет, потому что они глубоко в TestNG и вам оно ничего не даст


(Buba) #5

Спасибо за ответ!
Честно говоря, думал, что большинство разработчиков автотестов используют такую структуру - класс с тестами является наследником класса шаблона, в котором содержатся аннотации @Before… Поэтому так и упирал на них c целью поставить туда breakpoint. Но видимо действительно, есть еще множество интересных реализаций. Если поделитесь ссылками с примерами различных архитектур, буду признателен.


(t62) #6

ну … я не могу вам дать такую ссылку потому что нигде и не видел такого… как бы каждый пишет по возможности понимания работы + как говорил один человек - авто тесты должны быть просты, что бы любой кто будет работать с ними смог понять что оно делает. Вами представленна идея наследия тестового класа от какого то там класса шаблона нарушает принцып простоты теста.

если интересно откуда ноги ростут , поставьте брекпоинт гдето BeforeClass , и пройдите по стек трейсу вывовов, если найдёте что вас интересует, будет круто, но думаю там будет куча внутренних вызовов TestNG и всё.
если стека будет не хватать, опуститесь в саммый низ., и там в недрах фрейворка вы также можете поставить брек поинт…