@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Uvod

U ovom kratkom vodiču objasnit ćemo razlike između @Prije, @BeforeClass, @BeforeEach i @BeforeAll napomene u JUnit 4 i 5 - s praktičnim primjerima kako ih koristiti.

Također ćemo ukratko pokriti njihove @Nakon komplementarne bilješke.

Krenimo od JUnit 4.

2. @Prije

Metode označene s @Prije napomene se izvršavaju prije svakog testa. To je korisno kada želimo pokrenuti neki uobičajeni kôd prije pokretanja testa.

Pogledajmo primjer gdje inicijaliziramo popis i dodamo neke vrijednosti:

@RunWith (JUnit4.class) javna klasa BeforeAndAfterAnnotationsUnitTest {// ... popis privatnog popisa; @Prije javnog void init () {LOG.info ("pokretanje"); list = novi ArrayList (Arrays.asList ("test1", "test2")); } @Nakon javne void teardown () {LOG.info ("teardown"); list.clear (); }}

Primijetite da smo dodali i drugu metodu označenu s @Nakon kako bi se popis očistio nakon izvršenja svakog testa.

Nakon toga, dodajte nekoliko testova za provjeru veličine našeg popisa:

@Test public void whenCheckingListSize_thenSizeEqualsToInit () {LOG.info ("izvršavanje testa"); assertEquals (2, list.size ()); list.add ("još jedan test"); } @Test public void whenCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("izvršavanje drugog testa"); assertEquals (2, list.size ()); list.add ("još jedan test"); }

U ovom slučaju, prije pokretanja svakog testa presudno je osigurati da je testno okruženje pravilno postavljeno budući da se popis mijenja tijekom svakog izvođenja testa.

Ako pogledamo izlaz iz dnevnika možemo provjeriti je li u tome i srušiti metode su izvršene jednom po testu:

... pokretanje ... izvršavanje drugog testa ... prekid ... pokretanje ... izvršavanje testa ... prekid

3. @BeforeClass

Kada želimo izvršiti skupu uobičajenu operaciju prije svakog testa, poželjno je izvršiti ga samo jednom prije pokretanja svih testova koji se koriste @BeforeClass. Neki primjeri uobičajenih skupih operacija su stvaranje veze s bazom podataka ili pokretanje poslužitelja.

Stvorimo jednostavnu testnu klasu koja simulira stvaranje veze baze podataka:

@RunWith (JUnit4.class) javna klasa BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass javna statička void postavka () {LOG.info ("pokretanje - stvaranje DB veze"); } @AfterClass public static void tearDown () {LOG.info ("zatvaranje DB veze"); }}

Primijeti da ove metode moraju biti statične, tako da će se izvršiti prije pokretanja testova klase.

Kao i prije, dodajmo i nekoliko jednostavnih testova:

@Test public void simpleTest () {LOG.info ("jednostavan test"); } @Test public void anotherSimpleTest () {LOG.info ("još jedan jednostavan test"); }

Ovaj put, ako pogledamo izlaz iz dnevnika, možemo provjeriti je li postaviti i srušiti metode izvršene samo jednom:

... pokretanje - stvaranje DB veze ... jednostavan test ... još jedan jednostavan test ... zatvaranje DB veze

4. @BeforeEach i @BeforeAll

@BeforeEacruka @BeforeAll su JUnit 5 ekvivalenata @Prije i @BeforeClass. Te su napomene preimenovane u jasnija imena kako bi se izbjegla zabuna.

Idemo duplicirati naše prethodne razrede koristeći ove nove bilješke, počevši od @BeforeEach i @AfterEach napomene:

@RunWith (JUnitPlatform.class) klasa BeforeEachAndAfterEachAnnotationsUnitTest {// ... popis privatnog popisa; @BeforeEach void init () {LOG.info ("pokretanje"); list = novi ArrayList (Arrays.asList ("test1", "test2")); } @AfterEach void teardown () {LOG.info ("teardown"); list.clear (); } // ...}

Ako provjerimo zapisnike, možemo potvrditi da radi na isti način kao i kod @Prije i @Nakon napomene:

... pokretanje ... izvršavanje drugog testa ... prekid ... pokretanje ... izvršavanje testa ... prekid

Napokon, učinimo isto s drugom testnom klasom da vidimo @BeforeAll i @Nakon svega napomene u akciji:

@RunWith (JUnitPlatform.class) javna klasa BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll javna statička void postavka () {LOG.info ("pokretanje - stvaranje DB veze"); } @AfterAll javna statička void tearDown () {LOG.info ("zatvaranje DB veze"); } // ...}

I izlaz je isti kao i kod stare napomene:

... pokretanje - stvaranje DB veze ... jednostavan test ... još jedan jednostavan test ... zatvaranje DB veze

5. Zaključak

U ovom smo članku pokazali razlike između @Prije, @BeforeClass, @BeforeEach i @BeforeAll napomene u JUnit-u i kada treba koristiti svaku od njih.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.