web-dev-qa-db-fra.com

@BeforeTest de TestNg sur la classe de base ne se produisant qu'une seule fois par appareil

J'essaie d'utiliser @BeforeTest pour obtenir du code à ... exécuter une fois avant chaque test.

Voici mon code:

public class TestBase {
    @BeforeTest
    public void before() {
        System.out.println("BeforeTest");
    }
}

public class TestClass extends TestBase{
    @Test
    public void test1(){}

    @Test
    public void test2(){}
}

"BeforeTest" n'est imprimé qu'une fois, pas deux. Qu'est-ce que je fais mal?

30
ripper234

Utilisez @BeforeMethod, pas @BeforeTest.

La signification de @BeforeTest est expliquée dans la documentation .

45
Cedric Beust

"BeforeTest" n'est imprimé qu'une fois, pas deux. Qu'est-ce que je fais mal?

***Désolé. Je n'ai pas remarqué que vous êtes écrit @BeforeTest, mais dans votre exemple @BeforeTest est presque égal à @BeforeClass, et mieux utiliser @BeforeClass, quand vous n'avez plus de classes de test.

@BeforeClass "doit être déclaré dans la même classe que vos méthodes de test, pas différemment!

//Example

package test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class Tests {
private String bClass;
private String bMethod1;
private String bMethod2;

@BeforeClass
public void beforeClass() {
    bClass = "BeforeClass was executed once for this class";
}

@BeforeMethod
public void beforeMetodTest1() {
    bMethod1 = "It's before method for test1";
}

@Test
public void test1() {
    System.out.println(bClass);
    System.out.println(bMethod1);
}

@BeforeMethod
public void beforeMethodTest2() {
    bMethod2 = "It's before method for test2";
}

@Test
public void test2() {
    System.out.println(bClass);
    System.out.println(bMethod2);
}
}

@BeforeClass sera exécuté une fois, avant toutes vos méthodes de test dans cette classe. @BeforeMethod sera exécuté avant la méthode de test, avant laquelle il est écrit.

@BeforeClass peut être un seul dans la classe de test, à la différence @BeforeMethod! (S'il s'agit de @BeforeClass, ils sont effectués tour à tour, mais ce n'est pas une composition correcte du test)

P.S. Désolé pour mon anglais :)

3
Raman

Selon documentation , une méthode annotée avec @BeforeTest est exécutée avant l'exécution de toute méthode @Test appartenant aux classes à l'intérieur de la balise.

Selon mon expérience:

  • Chaque méthode @BeforeTest n'est exécutée qu'une seule fois
  • Si vous avez plusieurs méthodes @BeforeTest, l'ordre de leur exécution dépend de l'ordre de la classe contenant ces méthodes @BeforeTest.

Vous pouvez tester cela en configurant un exemple simple.

2
CuongHuyTo

Si vous utilisez @beforeTest, cette méthode sera exécutée une fois au début de chaque <test> (nous spécifions dans le fichier xml de combinaison de test) si ce test contient cette classe

Tous les @befortests dans toutes les classes dans un <test> sera exécuté au début de ce test

0
automaticSoldier