Poradie testov v JUnit
1. Prehľad
Predvolene, JUnit spúšťa testy v deterministickom, ale nepredvídateľnom poradí (MethodSorters.DEFAULT).
Vo väčšine prípadov je toto správanie úplne v poriadku a prijateľné; ale existujú prípady, kedy musíme presadiť konkrétne nariadenie.
2. Testovacia objednávka v JUnit 5
V JUnit 5, môžeme použiť @TestMethodOrder na kontrolu poradia vykonávania testov.
Môžeme použiť svoje vlastné MethodOrderer, ako uvidíme neskôr, alebo môžeme zvoliť jedného z troch zabudovaných objednávačov:
- @Objednať Anotácia
- Alfanumerické objednať
- Náhodné poradie
2.1. Pomocou @Objednať Anotácia
Môžeme použiť @Objednať anotácia na vynútenie vykonania testov v konkrétnom poradí.
V nasledujúcom príklade budú metódy bežať v tomto poradí - firstTest ()potom secondTest (), a nakoniec, tretí test ():
@TestMethodOrder (OrderAnnotation.class) verejná trieda OrderAnnotationUnitTest {súkromný statický výstup StringBuilder = nový StringBuilder (""); @Test @Order (1) public void firstTest () {output.append ("a"); } @Test @Order (2) public void secondTest () {output.append ("b"); } @Test @Order (3) public void thirdTest () {output.append ("c"); } @AfterAll verejné static void assertOutput () {assertEquals (output.toString (), "abc"); }}
2.2. Použitím Alfanumerické objednať
Môžeme tiež spustiť testy na základe ich mien v alfanumerickom poradí:
@TestMethodOrder (Alphanumeric.class) verejná trieda AlphanumericOrderUnitTest {súkromný statický výstup StringBuilder = nový StringBuilder (""); @Test public void myATest () {output.append ("A"); } @Test public void myBTest () {output.append ("B"); } @Test public void myaTest () {output.append ("a"); } @AfterAll verejné static void assertOutput () {assertEquals (output.toString (), "ABa"); }}
Upozorňujeme, že v alfanumerickom poradí sa rozlišujú veľké a malé písmená, takže najskôr sa použijú veľké a potom malé písmená.
Testy budú prebiehať v tomto poradí: myATest (), myBTest () a nakoniec myaTest ().
2.3. Pomocou vlastnej objednávky
Nakoniec môžeme použiť našu vlastnú objednávku vykonaním MethodOrderer rozhranie.
V našom CustomOrder, testy zoradíme na základe ich mien v alfanumerickom poradí bez rozlišovania malých a veľkých písmen:
verejná trieda CustomOrder implementuje MethodOrderer {@Override public void orderMethods (MethodOrdererContext context) {context.getMethodDescriptors (). sort ((MethodDescriptor m1, MethodDescriptor m2) -> m1.getMethod (). getName (). compareToIgnoreCase () .getName ())); }}
Potom použijeme CustomOrder spustiť rovnaké testy z nášho predchádzajúceho príkladu v tomto poradí - myATest (), myaTest (), a nakoniec, myBTest ():
@TestMethodOrder (CustomOrder.class) verejná trieda CustomOrderUnitTest {// ... @AfterAll verejné static void assertOutput () {assertEquals (output.toString (), "AaB"); }}
3. Testovacia objednávka v JUnit 4
Ak stále používate JUnit 4, rozhrania API na objednávanie testov sa mierne líšia.
Prejdime si možnosti, ako to dosiahnuť aj v predchádzajúcich verziách.
3.1. Použitím MethodSorters.DEFAULT
Táto predvolená stratégia porovnáva testovacie metódy s použitím ich hashcodes. V prípade hashovej kolízie sa použije lexikografické poradie:
@FixMethodOrder (MethodSorters.DEFAULT) verejná trieda DefaultOrderOfExecutionTest {súkromný statický výstup StringBuilder = nový StringBuilder (""); @Test public void secondTest () {output.append ("b"); } @Test public void thirdTest () {output.append ("c"); } @Test public void firstTest () {output.append ("a"); } @AfterClass public static void assertOutput () {assertEquals (output.toString (), "cab"); }}
Keď vykonáme testy v triede vyššie, uvidíme, že všetky prešli vrátane assertOutput ().
3.2. Použitím MethodSorters.JVM
Ďalšia stratégia objednávania je MethodSorters.JVM – táto stratégia využíva prirodzené usporiadanie JVM - ktoré sa môže pri každom behu líšiť:
@FixMethodOrder (MethodSorters.JVM) verejná trieda JVMOrderOfExecutionTest {// rovnaké ako vyššie}
Zakaždým, keď vykonáme testy v tejto triede, dostaneme iný výsledok.
3.3. Použitím MethodSorters.NAME_ASCENDING
Nakoniec je možné túto stratégiu použiť na spustenie testu v ich lexikografickom poradí:
@FixMethodOrder (MethodSorters.NAME_ASCENDING) verejná trieda NameAscendingOrderOfExecutionTest {// rovnaké ako vyššie @AfterClass public static void assertOutput () {assertEquals (output.toString (), "abc"); }}
Podobne, keď vykonáme testy v tejto triede, zistíme, že všetky vyhoveli vrátane assertOutput (), ktorý potvrdzuje exekučný príkaz, ktorý sme stanovili s anotáciou.
4. Záver
V tomto rýchlom výučbe sme si prešli spôsobmi nastavenia príkazu spustenia dostupného v JUnit.
A ako vždy, príklady použité v tomto článku nájdete na GitHub.