Différence entre @Before, @BeforeClass, @BeforeEach et @BeforeAll

432

Quelle est la principale différence entre

  • @Before et @BeforeClass
    • et dans JUnit 5 @BeforeEachet@BeforeAll
  • @After et @AfterClass

Selon le JUnit Api @Before est utilisé dans le cas suivant:

Lors de l'écriture de tests, il est courant de constater que plusieurs tests nécessitent la création d'objets similaires avant de pouvoir s'exécuter.

Considérant que @BeforeClasspeut être utilisé pour établir une connexion à la base de données. Mais ne pouvait pas @Beforefaire la même chose?

user1170330
la source

Réponses:

624

Le code marqué @Beforeest exécuté avant chaque test, tandis qu'il @BeforeClasss'exécute une fois avant l'ensemble du test. Si votre classe de test comporte dix tests, le @Beforecode sera exécuté dix fois, mais @BeforeClassne sera exécuté qu'une seule fois.

En général, vous utilisez @BeforeClasslorsque plusieurs tests doivent partager le même code d'installation coûteux en calcul. L'établissement d'une connexion à une base de données entre dans cette catégorie. Vous pouvez déplacer le code de @BeforeClassvers @Before, mais votre test peut prendre plus de temps. Notez que le code marqué @BeforeClassest exécuté comme un initialiseur statique, il s'exécutera donc avant la création de l'instance de classe de votre appareil de test.

Dans JUnit 5 , les balises @BeforeEachet @BeforeAllsont les équivalents de @Beforeet @BeforeClassdans JUnit 4. Leurs noms indiquent un peu plus quand ils s'exécutent, interprétés de manière lâche: «avant chaque test» et «une fois avant tous les tests».

dasblinkenlight
la source
4
Ah, maintenant l'exemple avec la connexion DB a du sens. Je vous remercie!
user1170330
6
@pacoverflow @BeforeClasest statique. Il s'exécute avant la création des instances de classe de test.
dasblinkenlight du
1
Gardez à l'esprit que lorsque vous utilisez @BeforeClass, votre méthode / paramètre doit être statique
tiagocarvalho92
Ce n'est pas directement lié, mais c'est un moyen de calculer le compteur «Tests par catégorie» .
Bsquare
Je vais seulement ajouter que cela @BeforeAllpeut être non statique et appeler à chaque nouvelle exécution d'instance de test. Voir la réponse correspondante stackoverflow.com/a/55720750/1477873
Sergey
124

Les différences entre chaque annotation sont:

+-------------------------------------------------------------------------------------------------------+
¦                                       Feature                            ¦   Junit 4    ¦   Junit 5   ¦
¦--------------------------------------------------------------------------+--------------+-------------¦
¦ Execute before all test methods of the class are executed.               ¦ @BeforeClass ¦ @BeforeAll  ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some initialization code          ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after all test methods in the current class.                     ¦ @AfterClass  ¦ @AfterAll   ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some cleanup code.                ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute before each test method.                                         ¦ @Before      ¦ @BeforeEach ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to reinitialize some class attributes used by the methods.  ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after each test method.                                          ¦ @After       ¦ @AfterEach  ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to roll back database modifications.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

La plupart des annotations dans les deux versions sont identiques, mais peu diffèrent.

Référence

Ordre d'exécution.

Boîte en pointillés -> annotation facultative.

entrez la description de l'image ici

Joby Wilson Mathews
la source
10

Avant et BeforeClass dans JUnit

L' @Beforeannotation de fonction sera exécutée avant chacune des fonctions de test de la classe ayant une @Testannotation mais la fonction avec @BeforeClassne sera exécutée qu'une seule fois avant toutes les fonctions de test de la classe.

De même, la fonction avec @Afterannotation sera exécutée après chacune des fonctions de test dans la classe ayant une @Testannotation mais la fonction avec@AfterClass ne qu'une seule fois après toutes les fonctions de test de la classe.

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

Échantillon test

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

Production

Before Class
Before Function
After Function
Before Function
After Function
After Class

En juin 5

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll
Dhyan Mohandas
la source
1
Très bon exemple.
kanaparthikiran
2
import org.junit.Assert
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test

class FeatureTest {
    companion object {
        private lateinit var heavyFeature: HeavyFeature
        @BeforeClass
        @JvmStatic
        fun beforeHeavy() {
            heavyFeature = HeavyFeature()
        }
    }

    private lateinit var feature: Feature

    @Before
    fun before() {
        feature = Feature()
    }

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}

Pareil que

import org.junit.Assert
import org.junit.Test

 class FeatureTest {
    companion object {
        private val heavyFeature = HeavyFeature()
    }

    private val feature = Feature()

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}
kreker
la source