Разница между BeforeClass и BeforeTest в TestNG

As we know from official TestNG documentation:

@BeforeClass: Аннотированный метод будет запущен до того, как будет запущен первый метод тестирования в текущем классе.

@BeforeTest: Аннотированный метод будет запущен до того, как будет запущен любой тестовый метод, принадлежащий классам внутри тега <test>.

Оба вышеупомянутых аннотации для тестирования выглядят одинаково по функциональности. Однако в этой функции должно быть уникальное различие. Может ли кто-нибудь подчеркнуть это?

Ответы

Ответ 1

SeleniumAbstractTest.class

public abstract class SeleniumAbstractTest {

  @BeforeSuite
  public void beforeSuite() {
    System.out.println("BeforeSuite");
  }

  @BeforeTest
  public void beforeTest() {
    System.out.println("BeforeTest");
  }

  @BeforeClass
  public void beforeClass() {
    System.out.println("BeforeClass");
  }

  @BeforeMethod
  public void beforeMethod() {
    System.out.println("BeforeMethod");
  }

  @AfterMethod
  public void afterMethod() {
    System.out.println("AfterMethod");
  }

  @AfterClass
  public void afterClass() {
    System.out.println("AfterClass");
  }

  @AfterTest
  public void afterTest() {
    System.out.println("AfterTest");
  }

  @AfterSuite
  public void afterSuite() {
    System.out.println("AfterSuite");
  }

}

MyTestClass1.class

public class MyTestClass1 extends SeleniumAbstractTest {

  @Test
  public void myTestMethod1() {
    System.out.println("myTestMethod1");
  }

  @Test
  public void myTestMethod2() {
    System.out.println("myTestMethod2");
  }
}

MyTestClass2.class

public class MyTestClass2 extends SeleniumAbstractTest {

  @Test
  public void myTestMethod3() {
    System.out.println("myTestMethod3");
  }

  @Test
  public void myTestMethod4() {
    System.out.println("myTestMethod4");
  }
}

Если у вас есть следующий набор тестов...

<suite name="Suite">
  <test name="Test1" >
    <classes>
       <class name="MyTestClass2" />
    </classes>
  </test>

  <test name="Test2">
    <classes>
      <class name="MyTestClass1"/>
      <class name="MyTestClass2"/>
    </classes>
  </test>
</suite>

... тогда вывод [с отступом для легкого чтения] будет

BeforeSuite
'   BeforeTest
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod3
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod4
'   '   '   AfterMethod
'   '   AfterClass
'   AfterTest
'   BeforeTest
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod1
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod2
'   '   '   AfterMethod
'   '   AfterClass
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod3
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod4
'   '   '   AfterMethod
'   '   AfterClass
'   AfterTest
AfterSuite

Надеюсь, поможет :)

Ответ 2

@BeforeMethod - выполняется перед каждым тестовым методом, например. Метод, который использует аннотацию @Test

@BeforeTest - выполняется только перед тегом, указанным в файле testng.xml.

В двух словах, @BeforeMethod работает над тестом, определенным в Java-классах. И @BeforeTest работает над тестом, определенным в XML файлах testng.xml i.e.

Ответ 3

если вы переходите из другого класса, это результаты:

parentTest - BeforeTest- parent     
testClass1 - BeforeTest- test1    
parentTest - BeforeClass- parent    
testClass1 - BeforeClass- test1    
parentTest - BeforeMethod- parent    
testClass1 - BeforeMethod- test1    
testClass1 - myTestMethod1    
testClass1 - AfterMethod- test1    
parentTest - AfterMethod- parent    
parentTest - BeforeMethod- parent    
testClass1 - BeforeMethod- test1    
testClass1 - myTestMethod2    
testClass1 - AfterMethod- test1    
parentTest - AfterMethod- parent
testClass1 - AfterClass- test1    
parentTest - AfterClass- parent
testClass1 - AfterTest- test1
parentTest – AfterTest- parent

Ответ 4

Мое мнение:

@BeforeClass: аннотированный метод будет запущен до того, как будет запущен первый метод тестирования в текущем классе

@BeforeTest: аннотированный метод будет запущен до запуска любого метода тестирования в текущем пакете

Ответ 5

Прежде чем объяснить разницу, сначала приведем несколько терминов тестирования

Test suite - состоит из одного или нескольких тегов теста.

Test tag - состоит из одного или нескольких тестовых классов.

Test class - состоит из одного или нескольких методов.

за экзамен

<suite name="suit1">
  <test name="TestTag1">
    <classes>
      <class name="TestClass1"/>
    </classes>
  </test>
  <test name="TestTag2">
    <classes>
      <class name="TestClass2"/>
      <class name="TestClass3"/>
    </classes>
  </test>
</suite>

@BeforeTest: он будет вызываться только один раз перед любым тестовым тегом, независимо от того, сколько тестовых классов внутри этого тега или сколько методов @Test, он будет вызываться только один раз для каждого тестового тега в предыдущем примере XML @BeforeTest будет вызываться дважды, один раз перед TestTag1 второй раз перед TestTag2 чтобы его можно было использовать для инициализации общих объектов между различными классами тестов внутри одного тестового тега.

@BeforeClass: он будет вызываться только один раз перед любым тестовым классом, независимо от того, сколько методов, @Test внутри этого тестового класса, он будет вызываться только один раз для каждого тестового класса, в предыдущем примере XML @BeforeClass будет TestClass1 три раза, один раз перед TestClass1 второй перед TestClass2 и третий раз перед TestClass3 чтобы его можно было использовать для инициализации общих объектов между различными методами тестирования внутри одного класса тестирования.

@BeforeSuite будет вызван один раз за костюм suit1

порядок звонков будет следующим

@BeforeSuite
    @BeforeTest
        @BeforeClass
            @BeforeMethod
                @Test

Чтобы узнать больше о @BeforeMethod, пожалуйста, обратитесь к ответу fooobar.com/info/15852076/...