@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Bemutatkozás

Ebben a rövid bemutatóban elmagyarázzuk a különbségeket a @Előtt, @Óra előtt, @BeforeEach és @BeforeAll annotációk a 4. és 5. JUnitben - gyakorlati példákkal azok használatára.

Röviden kitérünk ezekre is @Utána kiegészítő kommentárok.

Kezdjük a JUnit 4-gyel.

2. @Előtt

A módszerrel a @Előtt az annotációt minden teszt előtt végrehajtjuk. Ez akkor hasznos, ha a teszt futtatása előtt néhány általános kódot szeretnénk végrehajtani.

Lássunk egy példát, ahol inicializálunk egy listát, és hozzáadunk néhány értéket:

@RunWith (JUnit4.class) public class BeforeAndAfterAnnotationsUnitTest {// ... privát lista lista; @A nyilvános void előtt init () {LOG.info ("startup"); list = new ArrayList (Arrays.asList ("test1", "test2")); } @A nyilvános érvénytelen lebontás után () {LOG.info ("lebontás"); list.clear (); }}

Figyelje meg, hogy hozzáadtunk egy másik metódust is, amelyhez annotáltunk @Utána az egyes tesztek végrehajtása után a lista törlése érdekében.

Ezután adjunk hozzá néhány tesztet a listánk méretének ellenőrzéséhez:

@Test public void whenCheckingListSize_thenSizeEqualsToInit () {LOG.info ("teszt végrehajtása"); assertEquals (2, list.size ()); list.add ("újabb teszt"); } @Test public void whenCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("újabb teszt végrehajtása"); assertEquals (2, list.size ()); list.add ("még egy teszt"); }

Ebben az esetben, minden teszt futtatása előtt elengedhetetlen a tesztkörnyezet megfelelő beállításának biztosítása mivel a lista minden teszt végrehajtásakor módosul.

Ha megnézzük a napló kimenetét, ellenőrizhetjük, hogy a benne és lebontása módszereket tesztenként egyszer hajtották végre:

... indítás ... újabb teszt végrehajtása ... lebontás ... indítás ... teszt végrehajtása ... lebontás

3. @Óra előtt

Amikor minden teszt előtt egy drága közös műveletet akarunk végrehajtani, célszerű csak egyszer végrehajtani, mielőtt az összes tesztet futtatná @Óra előtt. Néhány példa a gyakori drága műveletekre: adatbázis-kapcsolat létrehozása vagy egy szerver indítása.

Hozzunk létre egy egyszerű tesztosztályt, amely szimulálja az adatbázis-kapcsolat létrehozását:

@RunWith (JUnit4.class) public class BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass public static void setup () {LOG.info ("indítás - DB kapcsolat létrehozása"); } @AfterClass public static void tearDown () {LOG.info ("záródó DB kapcsolat"); }}

Figyelje meg ezeknek a módszereknek statikusaknak kell lenniük, így az osztály tesztjeinek futtatása előtt végrehajtásra kerülnek.

Mint korábban tettük, adjunk hozzá néhány egyszerű tesztet is:

@Test public void simpleTest () {LOG.info ("egyszerű teszt"); } @Test public érvénytelen egy másikSimpleTest () {LOG.info ("újabb egyszerű teszt"); }

Ezúttal, ha megnézzük a napló kimenetét, ellenőrizhetjük, hogy a beállít és tearDown a módszereket csak egyszer hajtották végre:

... indítás - DB kapcsolat létrehozása ... egyszerű teszt ... egy másik egyszerű teszt ... DB kapcsolat lezárása

4. @BeforeEach és @BeforeAll

@BeforeEackéz @BeforeAll a JUnit 5 megfelelője @Előtt és @Óra előtt. Ezeket a megjegyzéseket egyértelműbb nevekkel nevezték el, hogy elkerüljék az összetévesztést.

Ismételjük meg korábbi osztályainkat az új kommentárokkal, kezdve a @BeforeEach és @AfterEach kommentárok:

@RunWith (JUnitPlatform.class) class BeforeEachAndAfterEachAnnotationsUnitTest {// ... privát lista lista; @BeforeEach void init () {LOG.info ("indítás"); list = new ArrayList (Arrays.asList ("test1", "test2")); } @AfterEach void teardown () {LOG.info ("teardown"); list.clear (); } // ...}

Ha ellenőrizzük a naplókat, megerősíthetjük, hogy ugyanúgy működik, mint a @Előtt és @Utána kommentárok:

... indítás ... újabb teszt végrehajtása ... lebontás ... indítás ... teszt végrehajtása ... lebontás

Végül tegyük ugyanezt a másik tesztosztályral, hogy lássuk @BeforeAll és @Végül kommentárok működés közben:

@RunWith (JUnitPlatform.class) public class BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll public static void setup () {LOG.info ("indítás - DB kapcsolat létrehozása"); } @AfterAll nyilvános statikus void tearDown () {LOG.info ("bezáródó DB kapcsolat"); } // ...}

És a kimenet ugyanaz, mint a régi kommentárnál:

... indítás - DB kapcsolat létrehozása ... egyszerű teszt ... egy másik egyszerű teszt ... DB kapcsolat lezárása

5. Következtetés

Ebben a cikkben megmutattuk a különbségeket a @Előtt, @Óra előtt, @BeforeEach és @BeforeAll annotációk a JUnit-ben, és mikor kell mindegyiket használni.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.