Перейти к содержимому

Фотография

Кол-во запусков тестов в TestNG.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 25 мая 2016 - 16:34

Привет.

 

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

Работает всё через jenkins + ant.

 

Вопрос в следующем: суммарно методов с аннотацией (@test) 81, но самих прогонов около 300, т.е. некоторые запускаются несколько раз, чего я и не могу понять. У @test'ов не прописан invocationCount, в .xml один suite с последовательным перечислением классов в которых находятся тест-методы. Пробовал найти что-нибудь ещё, в духе конфига какого-нибудь, но вроде ничего такого нет. Где ещё может быть указано сколько раз запускать определённые тесты?

 


  • 0

#2 serjb9

serjb9

    Новый участник

  • Members
  • Pip
  • 68 сообщений

Отправлено 25 мая 2016 - 17:08

датапровайдер есть? 


  • 0

#3 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 25 мая 2016 - 17:38

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


  • 0

#4 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 25 мая 2016 - 18:10

датапровайдер есть? 

Ага. Но я там только данные для тестов видел. Может не досмотрел что-то.

 

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

С работы ушёл уже просто.


  • 0

#5 serjb9

serjb9

    Новый участник

  • Members
  • Pip
  • 68 сообщений

Отправлено 26 мая 2016 - 04:32

 

датапровайдер есть? 

Ага. Но я там только данные для тестов видел. Может не досмотрел что-то.

 

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

Т.е. задан сферический датапровайдер

@Dataprovider
public Object[][] testProvider () {
     return new Object[][] {
          ["one", "one"],
          ["two", "two"]
     }
}

означает, что тест пройдет два раза с наборами one one, two two


  • 1

#6 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 26 мая 2016 - 09:18

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

Рефлекшены, упираются в testng.

 

 

 

 

датапровайдер есть? 

Ага. Но я там только данные для тестов видел. Может не досмотрел что-то.

 

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

Т.е. задан сферический датапровайдер

@Dataprovider
public Object[][] testProvider () {
     return new Object[][] {
          ["one", "one"],
          ["two", "two"]
     }
}

означает, что тест пройдет два раза с наборами one one, two two

 

Да, так и есть. Вчера, видать, где-то глаз замылился, мне показалось что кол-во данных не совпало.

 

Просто проблема в том, что в родительском классе в @BeforeClass прописано делать рестарт сервера и сброс базы (шелл команды), но этот метод вызывается слишком часто. Конкретно это на бряку поставить не могу, так прогоняется на сервере, надо туда настроить отсылку команд для рестарта сервера/работу с бд.

 

Как пример, у здесь в одном из тестовых классов есть 2 тестовых метода (apply_achievment, claim_achievment_reward), каждый вызывается по одному разу. Но сам сброс энвайрнмента происходит 7 раз (вот этот кусок лога повторяется 7 раз):
03:09:15 [testng] [Invoker 1734982295] Keeping method Base_Test.beforeClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:09:15 [testng] [Invoker 1734982295] Invoking @BeforeClass Base_Test.beforeClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a]
03:09:15 [testng] kill 
03:09:38 [testng] start
03:12:08 [testng] [Invoker 1734982295] Keeping method Achievement_Test.beforeMethod()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Keeping method Achievement_Test.afterMethod()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Keeping method Achievement_Test.beforeMethod()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Keeping method Achievement_Test.afterMethod()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Keeping method Achievement_Test.afterClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Invoking @AfterClass Achievement_Test.afterClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a]
03:12:08 [testng] [Invoker 1734982295] Keeping method Base_Test.beforeClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a] for class [TestClass name=class test.core.tests.Achievement_Test]
03:12:08 [testng] [Invoker 1734982295] Invoking @BeforeClass Base_Test.beforeClass()[pri:0, instance:test.core.tests.Achievement_Test@6bb2725a]

 

Для разных классов разное кол-во раз вызывается, я никакой закономерности найти не могу. Причины тоже. Всего для 300 тестов рестартится сервер 120 раз, что черезчур много. Собственно, вот с этим я и пытаюсь разобраться в данный момент.


  • 0

#7 serjb9

serjb9

    Новый участник

  • Members
  • Pip
  • 68 сообщений

Отправлено 26 мая 2016 - 12:28

Покажите закомменченый код, скорее всего у вас в проблема в неправлено расставленных аннотациях (или проблема с тем, что туда помещено).

Ну или попробуйте вынести рестарт сервера в другую, не в before class аннотацию (выше).

Т.к. тестов у вас всего 120, скорее всего после каждого Class, выполняется Before Class (с after class естесственно).

+- before suite/
   +- before group/
      +- before test/
         +- before class/
            +- before method/
               +- test/
            +- after method/ ...
         +- after class/ ...
      +- after test/ ...
   +- after group/ ...
+- after suite/ 

  • 1

#8 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 26 мая 2016 - 14:33

с точки зрения сферического тестового фреймворка в вакууме. А не прикручен ли у вас датапровайдер к классу а не к методу? Тогда у вас будет N раз создаваться класс  и соответственно вызываться @BeforeClass


  • 1

#9 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 27 мая 2016 - 07:15

 

Покажите закомменченый код, скорее всего у вас в проблема в неправлено расставленных аннотациях (или проблема с тем, что туда помещено).

Ну или попробуйте вынести рестарт сервера в другую, не в before class аннотацию (выше).

Т.к. тестов у вас всего 120, скорее всего после каждого Class, выполняется Before Class (с after class естесственно).

+- before suite/
   +- before group/
      +- before test/
         +- before class/
            +- before method/
               +- test/
            +- after method/ ...
         +- after class/ ...
      +- after test/ ...
   +- after group/ ...
+- after suite/ 

Методов с аннотацией @Test 80, запусков ~300.

Структура xml'ки следующая:
 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite group-by-instances="true" name="main" time-out="140000" verbose="10">
     <test enabled="true" name="Test_test1">
          <classes>
               <class name="test.core.tests.Test_test1" />
          </classes>
     </test>
     <test enabled="true" name="Test_test2">
          <classes>
               <class name="test.core.tests.Test_test2" />
           </classes>
     </test>
<suite>     

  • 0

#10 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 27 мая 2016 - 08:07

с точки зрения сферического тестового фреймворка в вакууме. А не прикручен ли у вас датапровайдер к классу а не к методу? Тогда у вас будет N раз создаваться класс  и соответственно вызываться @BeforeClass

Похоже рояль в кустах пропустил. В Base_test (родительский класс теста) есть 2 @DataProivder-итератора, один проходит по списку "девайсов" и передаётся в @Factory тестов (в конструктор дочернего от Base_test класса), другой проходит по списку аргументов для самих тестов (передаёт аргументы в @Test). В итоге для 17 тест-классов и 7 "девайсов" как раз выходит 119+1 рестарта. При этом сами тесты прогоняются нужное кол-во раз. Осталось понять, зачем это вообще так реализовано было.

Спасибо за помощь всем кто отписывался.


  • 0

#11 Garm

Garm

    Активный участник

  • Members
  • PipPip
  • 116 сообщений

Отправлено 27 мая 2016 - 08:08

Случайно "цитировал" вместо "изменить". Не вижу кнопки "удалить" для сообщений.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных