web-dev-qa-db-fra.com

Différence entre BeforeClass et BeforeTest dans TestNG

As we know from official TestNG documentation:

@BeforeClass: La méthode annotée sera exécutée avant que la première méthode de test de la classe en cours soit appelée.

@BeforeTest: La méthode annotée sera exécutée avant toute méthode de test appartenant aux classes de la balise <test>.

Les deux annotations de test ci-dessus ont une fonctionnalité similaire. Cependant, il devrait y avoir une différence unique dans la fonctionnalité. Quelqu'un peut-il s'il vous plaît souligner cela? 

20
Prashanth Sams

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");
  }
}

Si vous avez la suite de tests suivante ...

<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>

... alors la sortie [en retrait pour faciliter la lecture] sera

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

J'espère que ça aide :)

81
peetya

@BeforeMethod - s'exécute avant chaque méthode de test, par exemple. La méthode qui utilise l'annotation @Test

@BeforeTest - s'exécute uniquement avant la balise donnée dans le fichier testng.xml.

En bref, @BeforeMethod fonctionne sur test défini dans les classes Java . Et @BeforeTest fonctionne sur test défini dans testng.xml i.e fichiers XML.

6
Dinesh Nikam

Mes opinions:

@BeforeClass: la méthode annotée sera exécutée avant que la première méthode de test dans la classe en cours soit invoquée

@BeforeTest: la méthode annotée sera exécutée avant toute méthode de test dans la suite actuelle est exécuté

1
MorganChen

si vous prolongez d'une autre classe ce sont les résultats:

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
1
David_Garcia