96 votes

@BeforeClass et héritage - ordre d'exécution

J'ai une classe de base abstraite, que j'utilise comme base pour mes tests unitaires (TestNG 5.10). Dans cette classe j'initialise l'ensemble de l'environnement pour mes tests, configuration des mappages de base de données, etc. Cette classe abstraite est une méthode avec un @BeforeClass d'annotation qui ne l'initialisation. Autre chose, j'étends la classe avec des classes spécifiques dans lesquels j'ai l' @Test méthodes et @BeforeClass méthodes. Ces méthodes spécifiques à la classe d'initialisation de l'environnement, par exemple, certains enregistrements dans la base de données.

Ma question est comment je peut faire exécuter un ordre spécifique de la @BeforeClass annoté méthodes. J'ai besoin de ceux de la classe de base abstraite pour être exécuté avant le celles de l'extension de la classe.

Exemple:

abstract class A {
 @BeforeClass
 doInitialization() {...}
}

class B extends A {
 @BeforeClass
 doSpecificInitialization() {...}

 @Test
 doTests() {...}
}

Ordre attendu:

A.doInitialization
B.doSpecificInitialization
B.doTests

Commande:

B.doSpecificInitialization // <- crashes, as the basic init is missing
(A.doInitialization        // <---not executed
 B.doTests)                // <-/

116voto

Fortega Points 8890

edit: La réponse ci-dessous est pour JUnit , mais je vais le laisser ici de toute façon, car cela pourrait être utile.

Selon l’ API JUnit : "Les méthodes des superclasses @BeforeClass seront exécutées avant celles de la classe actuelle."

J'ai testé cela et cela semble fonctionner pour moi ...

52voto

Bozho Points 273663

Ne mettez pas les @BeforeClass sur la classe abstract . Appelez-le de chaque sous-classe.

 abstract class A {
    void doInitialization() {}
}

class B extends A {
    @BeforeClass
    void doSpecificInitialization() {
        super.doInitialization();
    }

    @Test
    void doTests() {}
}
 

On dirait que TestNG a @BeforeClass(dependsOnMethods={"doInitialization"}) - essayez-le.

7voto

Paul Points 21

J'ai ajouté "public" à la classe abstraite et TestNG (v. 6.0.1) a exécuté doInitialization () avant doTests. TestNG n'exécute pas doInitialization() si je supprime "public" de la classe A.

 public abstract class A {
 @BeforeClass
 doInitialization() {...}
}

class B extends A {    
 @Test
 doTests() {...}
}
 

6voto

Cedric Beust Points 7209

Je viens d'essayer votre exemple avec 5.11 et j'obtiens d'abord le @BeforeClass de la classe de base.

Pouvez-vous poster votre fichier testng.xml? Peut-être que vous spécifiez à la fois A et B, alors que seul B est nécessaire.

N'hésitez pas à faire un suivi sur la liste de diffusion testng-users et nous pourrons examiner de plus près votre problème.

- Cédric

1voto

Tatome Points 21

Pourquoi ne pas demander à votre méthode @BeforeClass d'appeler une méthode spécifique videBeforeClass () qui peut ou non être écrasée par des sous-classes, comme ceci:

 public class AbstractTestClass {
  @BeforeClass
  public void generalBeforeClass() {
    // do stuff
    specificBeforeClass();
  }

  protected void specificBeforeClass() {}
}

public class SpecificTest {
  @Override
  protected void specificBeforeClass() {
    // Do specific stuff
  }

  // Tests
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X