@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Introduksjon

I denne korte opplæringen skal vi forklare forskjellene mellom @Før, @BeforeClass, @BeforeEach og @BeforeAll merknader i JUnit 4 og 5 - med praktiske eksempler på hvordan du bruker dem.

Vi vil også kort dekke deres @Etter utfyllende merknader.

La oss starte med JUnit 4.

2. @Før

Metoder kommentert med @Før merknader utføres før hver test. Dette er nyttig når vi vil utføre noen vanlig kode før vi kjører en test.

La oss se et eksempel der vi initialiserer en liste og legger til noen verdier:

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

Legg merke til at vi også la til en annen metode som er merket med @Etter for å tømme listen etter gjennomføring av hver test.

Etter det, la oss legge til noen tester for å sjekke størrelsen på listen vår:

@Test offentlig ugyldig nårCheckingListSize_thenSizeEqualsToInit () {LOG.info ("kjører test"); assertEquals (2, list.size ()); list.add ("en annen test"); } @Test offentlig ugyldig nårCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("utfører en ny test"); assertEquals (2, list.size ()); list.add ("enda en test"); }

I dette tilfellet, det er viktig å sørge for at testmiljøet er riktig konfigurert før du kjører hver test siden listen endres under hver testutførelse.

Hvis vi tar en titt på loggutgangen, kan vi sjekke at i det og rive ned metodene ble utført en gang per test:

... oppstart ... utfører en annen test ... nedbrytning ... oppstart ... utfører test ... nedbrytning

3. @BeforeClass

Når vi ønsker å utføre en kostbar vanlig operasjon før hver test, det er å foretrekke å utføre den bare en gang før du kjører alle testene ved hjelp @BeforeClass. Noen eksempler på vanlige dyre operasjoner er opprettelsen av en databaseforbindelse eller oppstart av en server.

La oss lage en enkel testklasse som simulerer opprettelsen av en databaseforbindelse:

@RunWith (JUnit4.class) offentlig klasse BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass offentlig statisk ugyldig oppsett () {LOG.info ("oppstart - oppretter DB-forbindelse"); } @AfterClass offentlig statisk ugyldighet tearDown () {LOG.info ("lukker DB-tilkobling"); }}

Legg merke til det disse metodene må være statiske, slik at de blir henrettet før du kjører testene i klassen.

Som vi gjorde før, la oss også legge til noen enkle tester:

@Test offentlig ugyldig simpleTest () {LOG.info ("enkel test"); } @Test offentlig annullere anotherSimpleTest () {LOG.info ("nok en enkel test"); }

Denne gangen, hvis vi tar en titt på loggutgangen, kan vi sjekke at oppsett og rive ned metodene ble utført bare en gang:

... oppstart - oppretter DB-tilkobling ... enkel test ... en annen enkel test ... lukker DB-tilkobling

4. @BeforeEach og @BeforeAll

@BeforeEachånd @BeforeAll er JUnit 5-ekvivalenter av @Før og @BeforeClass. Disse kommentarene ble omdøpt med klarere navn for å unngå forvirring.

La oss duplisere de tidligere klassene våre ved hjelp av disse nye kommentarene, og begynner med @BeforeEach og @EfterEach kommentarer:

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

Hvis vi sjekker logger, kan vi bekrefte at den fungerer på samme måte som med @Før og @Etter kommentarer:

... oppstart ... utfører en annen test ... nedbrytning ... oppstart ... utfører test ... nedbrytning

Til slutt, la oss gjøre det samme med den andre testklassen for å se @BeforeAll og @Tross alt merknader i aksjon:

@RunWith (JUnitPlatform.class) public class BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll public static void setup () {LOG.info ("startup - creating DB connection"); } @AfterAll offentlig statisk ugyldighet tearDown () {LOG.info ("lukker DB-tilkobling"); } // ...}

Og utgangen er den samme som med den gamle kommentaren:

... oppstart - oppretter DB-tilkobling ... enkel test ... en annen enkel test ... lukker DB-tilkobling

5. Konklusjon

I denne artikkelen viste vi forskjellene mellom @Før, @BeforeClass, @BeforeEach og @BeforeAll merknader i JUnit og når hver av dem skal brukes.

Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.


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