@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. Úvod

V tomto krátkom návode vysvetlíme rozdiely medzi @ Predtým, @BeforeClass, @ Predtým každý a @BeforeAll anotácie v JUnit 4 a 5 - s praktickými príkladmi ich použitia.

Krátko sa budeme venovať aj ich @ Potom doplňujúce poznámky.

Začnime JUnit 4.

2. @ Predtým

Metódy anotované s @ Predtým anotácie sa vykonajú pred každým testom. To je užitočné, keď chceme pred vykonaním testu spustiť nejaký bežný kód.

Pozrime sa na príklad, kde inicializujeme zoznam a pridáme nejaké hodnoty:

@RunWith (JUnit4.class) verejná trieda BeforeAndAfterAnnotationsUnitTest {// ... súkromný zoznam; @ Pred public void init () {LOG.info ("spustenie"); list = new ArrayList (Arrays.asList ("test1", "test2")); } @After public void teardown () {LOG.info ("teardown"); list.clear (); }}

Všimnite si, že sme pridali aj inú metódu s poznámkami @ Potom za účelom vymazania zoznamu po vykonaní každého testu.

Potom pridajme niekoľko testov na kontrolu veľkosti nášho zoznamu:

@Test public void whenCheckingListSize_thenSizeEqualsToInit () {LOG.info ("vykonávanie testu"); assertEquals (2, list.size ()); list.add ("ďalší test"); } @Test public void whenCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("vykonanie iného testu"); assertEquals (2, list.size ()); list.add ("ešte ďalší test"); }

V tomto prípade, pred vykonaním každého testu je nevyhnutné zabezpečiť správne nastavenie testovacieho prostredia pretože zoznam sa počas každého vykonania testu upravuje.

Ak sa pozrieme na výstup protokolu, môžeme skontrolovať, či init a strhnúť metódy boli vykonané raz za test:

... uvedenie do prevádzky ... vykonanie ďalšieho testu ... demontáž ... spustenie ... vykonanie testu ... demontáž

3. @BeforeClass

Ak chceme pred každým testom vykonať nákladnú spoločnú operáciu, je lepšie ho vykonať iba raz pred spustením všetkých testov pomocou @BeforeClass. Niektoré príklady bežných drahých operácií sú vytvorenie databázového pripojenia alebo spustenie servera.

Poďme vytvoriť jednoduchú testovaciu triedu, ktorá simuluje vytvorenie databázového pripojenia:

@RunWith (JUnit4.class) verejná trieda BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass public static void setup () {LOG.info ("spustenie - vytvorenie spojenia DB"); } @AfterClass public static void tearDown () {LOG.info ("ukončenie pripojenia DB"); }}

Všimni si tieto metódy musia byť statické, takže sa vykonajú pred vykonaním testov triedy.

Rovnako ako predtým sme pridali aj niekoľko jednoduchých testov:

@Test public void simpleTest () {LOG.info ("jednoduchý test"); } @Test public void anotherSimpleTest () {LOG.info ("ďalší jednoduchý test"); }

Tentokrát, ak sa pozrieme na výstup protokolu, môžeme skontrolovať, či nastaviť a strhnúť metódy boli vykonané iba raz:

... spustenie - vytvorenie pripojenia DB ... jednoduchý test ... ďalší jednoduchý test ... ukončenie pripojenia DB

4. @ Predtým každý a @BeforeAll

@BeforeEach a @BeforeAll sú JUnit 5 ekvivalentov @ Predtým a @BeforeClass. Tieto anotácie boli premenované na jasnejšie názvy, aby nedošlo k zámene.

Duplikujme naše predchádzajúce triedy pomocou týchto nových anotácií, počnúc znakom @ Predtým každý a @AfterEach anotácie:

@RunWith (JUnitPlatform.class) trieda BeforeEachAndAfterEachAnnotationsUnitTest {// ... súkromný zoznam; @BeforeEach void init () {LOG.info ("spustenie"); list = new ArrayList (Arrays.asList ("test1", "test2")); } @AfterEach void teardown () {LOG.info ("teardown"); list.clear (); } // ...}

Ak skontrolujeme protokoly, môžeme potvrdiť, že funguje rovnako ako v prípade protokolu @ Predtým a @ Potom anotácie:

... uvedenie do prevádzky ... vykonanie ďalšieho testu ... demontáž ... spustenie ... vykonanie testu ... demontáž

Nakoniec urobíme to isté s inou testovacou triedou, aby sme videli @BeforeAll a @Po všetkom anotácie v akcii:

@RunWith (JUnitPlatform.class) verejná trieda BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll public static void setup () {LOG.info ("spustenie - vytvorenie spojenia DB"); } @AfterAll verejné statické void tearDown () {LOG.info ("ukončenie pripojenia DB"); } // ...}

A výstup je rovnaký ako pri starej anotácii:

... spustenie - vytvorenie pripojenia DB ... jednoduchý test ... ďalší jednoduchý test ... ukončenie pripojenia DB

5. Záver

V tomto článku sme ukázali rozdiely medzi @ Predtým, @BeforeClass, @BeforeEach a @BeforeAll anotácie v JUnit a kedy by sa mali použiť každé z nich.

Celý zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


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