@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.