@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Introduktion

I denne korte vejledning skal vi forklare forskellene mellem @Før, @BeforeClass, @BeforeEach og @BeforeAll bemærkninger i JUnit 4 og 5 - med praktiske eksempler på, hvordan man bruger dem.

Vi vil også kort dække deres @Efter supplerende kommentarer.

Lad os starte med JUnit 4.

2. @Før

Metoder kommenteret med @Før annotering udføres før hver test. Dette er nyttigt, når vi vil udføre en almindelig kode, før vi kører en test.

Lad os se et eksempel, hvor vi initialiserer en liste og tilføjer nogle værdier:

@RunWith (JUnit4.class) offentlig klasse BeforeAndAfterAnnotationsUnitTest {// ... privat liste liste; @Før offentlig ugyldig init () {LOG.info ("opstart"); liste = ny ArrayList (Arrays.asList ("test1", "test2")); } @Efter offentlig ugyldig nedrivning () {LOG.info ("nedrivning"); list.clear (); }}

Bemærk, at vi også tilføjede en anden metode, der er kommenteret med @Efter for at rydde listen efter udførelsen af ​​hver test.

Lad os derefter tilføje nogle tests for at kontrollere størrelsen på vores liste:

@Test offentlig ugyldig nårCheckingListSize_thenSizeEqualsToInit () {LOG.info ("eksekveringstest"); assertEquals (2, list.size ()); list.add ("en anden test"); } @Test offentlig ugyldig nårCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("udfører en anden test"); assertEquals (2, list.size ()); list.add ("endnu en test"); }

I dette tilfælde, det er afgørende at sikre, at testmiljøet er korrekt indstillet, før du kører hver test da listen ændres under hver testudførelse.

Hvis vi ser på logoutputtet, kan vi kontrollere, at i det og rive ned metoder blev udført en gang pr. test:

... opstart ... udfører endnu en test ... nedbrydning ... opstart ... udfører test ... nedbrydning

3. @BeforeClass

Når vi ønsker at udføre en dyr fælles operation før hver test, det foretrækkes at udføre det kun en gang, før du kører alle tests ved hjælp af @BeforeClass. Nogle eksempler på almindelige dyre operationer er oprettelsen af ​​en databaseforbindelse eller opstart af en server.

Lad os oprette en simpel testklasse, der simulerer oprettelsen af ​​en databaseforbindelse:

@RunWith (JUnit4.class) offentlig klasse BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass offentlig statisk ugyldig opsætning () {LOG.info ("opstart - oprettelse af DB-forbindelse"); } @AfterClass offentlig statisk ugyldighed tearDown () {LOG.info ("lukning af DB-forbindelse"); }}

Læg mærke til det disse metoder skal være statiske, så de bliver henrettet, før de kører testene i klassen.

Som vi gjorde før, lad os også tilføje nogle enkle tests:

@Test offentlig ugyldig simpleTest () {LOG.info ("simpel test"); } @ Test offentlig annullerer anotherSimpleTest () {LOG.info ("endnu en simpel test"); }

Denne gang, hvis vi ser på logoutputtet, kan vi kontrollere, at Opsætning og rive ned metoder blev kun udført en gang:

... opstart - oprettelse af DB-forbindelse ... simpel test ... endnu en simpel test ... lukning af DB-forbindelse

4. @BeforeEach og @BeforeAll

@BeforeEach og @BeforeAll er JUnit 5-ækvivalenter af @Før og @BeforeClass. Disse kommentarer blev omdøbt med klarere navne for at undgå forvirring.

Lad os duplikere vores tidligere klasser ved hjælp af disse nye kommentarer, startende med @BeforeEach og @AfterEach kommentarer:

@RunWith (JUnitPlatform.class) klasse BeforeEachAndAfterEachAnnotationsUnitTest {// ... privat liste liste; @BeforeEach ugyldig init () {LOG.info ("opstart"); liste = ny ArrayList (Arrays.asList ("test1", "test2")); } @AfterEach ugyldig nedrivning () {LOG.info ("nedrivning"); list.clear (); } // ...}

Hvis vi tjekker logfiler, kan vi bekræfte, at det fungerer på samme måde som med @Før og @Efter kommentarer:

... opstart ... udfører endnu en test ... nedbrydning ... opstart ... udfører test ... nedbrydning

Lad os endelig gøre det samme med den anden testklasse for at se @BeforeAll og @Trods alt annoteringer i aktion:

@RunWith (JUnitPlatform.class) offentlig klasse BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll offentlig statisk ugyldig opsætning () {LOG.info ("opstart - oprettelse af DB-forbindelse"); } @AfterAll offentlig statisk ugyldighed tearDown () {LOG.info ("lukning af DB-forbindelse"); } // ...}

Og output er det samme som med den gamle kommentar:

... opstart - oprettelse af DB-forbindelse ... simpel test ... endnu en simpel test ... lukning af DB-forbindelse

5. Konklusion

I denne artikel viste vi forskellene mellem @Før, @BeforeClass, @BeforeEach og @BeforeAll kommentarer i JUnit, og hvornår hver af dem skal bruges.

Som altid er den fulde kildekode for eksemplerne tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found