JUnit 5 pre vývojárov Kotlin

1. Úvod

Novo vydaný JUnit 5 je ďalšou verziou známeho testovacieho rámca pre Javu. Táto verzia obsahuje niekoľko funkcie, ktoré sa osobitne zameriavajú na funkčnosť zavedenú v prostredí Java 8 - je primárne postavený na použití výrazov lambda.

V tomto rýchlom článku si ukážeme, ako dobre funguje ten istý nástroj pracuje s jazykom Kotlin.

2. Jednoduché testy JUnit 5

Úplne najjednoduchšie funguje test JUnit 5 napísaný v Kotline presne podľa očakávania. Píšeme testovaciu triedu a komentujeme naše testovacie metódy znakom @Test anotáciu, napíšte náš kód a vykonajte tvrdenia:

trieda CalculatorTest {private val calculator = Calculator () @Test fun whenAdding1and3_thenAnswerIs4 () {Assertions.assertEquals (4, calculator.add (1, 3))}}

Všetko tu funguje iba po vybalení z krabice. Môžeme využiť štandard @Test, @BeforeAll, @BeforeEach, @AfterEach, a @Po všetkom anotácie. Môžeme tiež interagovať s poľami v testovacej triede úplne rovnako ako v prostredí Java.

Upozorňujeme, že požadovaný dovoz sa líši a robímetvrdenia pomocou Tvrdenia triedy namiesto Tvrdiť trieda. Toto je štandardná zmena pre JUnit 5 a nie je špecifická pre Kotlin.

Predtým, ako pôjdeme ďalej, zmeňme názov a použitie testu bpotvrdené identifikátory v Kotline:

@Test fun `Pridanie 1 a 3 by sa malo rovnať 4` () {Assertions.assertEquals (4, calculator.add (1, 3))}

Teraz je to oveľa čitateľnejšie! V Kotline môžeme deklarovať všetky premenné a funkcie pomocou spätných kariet, ale pre bežné prípady použitia sa to neodporúča.

3. Pokročilé tvrdenia

JUnit 5 pridáva niektoré pokročilé tvrdenia prepráca s lambdami. Tieto fungujú v Kotline rovnako ako v Jave, ale je potrebné ich vyjadriť trochu inak kvôli spôsobu fungovania jazyka.

3.1. Uplatňovanie výnimiek

JUnit 5 pridáva tvrdenie, keď sa od hovoru očakáva, že vyvolá výnimku. Môžeme otestovať, že konkrétny hovor - a nie iba akýkoľvek hovor v metóde - vyvolá očakávanú výnimku. Môžeme dokonca tvrdiť o samotnej výnimke.

V Jave by sme do hovoru odoslali lambdu Assertions.assertHodí. To isté robíme v Kotline, ale môžeme aby bol kód čitateľnejší pridaním bloku na koniec výzvy na tvrdenie:

@Test fun `Delenie nulou by malo vyhodiť DivideByZeroException` () {val výnimka = Assertions.assertThrows (DivideByZeroException :: class.java) {calculator.divide (5, 0)} Assertions.assertEquals (5, exception.numerator)}

Tento kód funguje úplne rovnako ako ekvivalent Java, ale je ľahšie čitateľný, pretože nemusíme prechádzať lambdou do zátvoriek, kde voláme tvrdiťHodí funkcie.

3.2. Viaceré tvrdenia

JUnit 5 pridáva schopnosť vykonávať viac tvrdení súčasne, a vyhodnotí ich všetkých a informuje o všetkých zlyhaniach.

To nám umožňuje zhromaždiť viac informácií v jednom testovacom chode, než aby sme boli nútení opraviť jednu chybu, aby sme narazili na ďalšiu. Aby sme tak urobili, voláme Assertions.assertAll, odovzdávajúc ľubovoľný počet lambdas.

V Kotline, musíme to vyriešiť trochu inak. The funkcia v skutočnosti trvá a varargs parameter typu Spustiteľný.

V súčasnosti neexistuje podpora pre automatické prenášanie lambdy na funkčné rozhranie, takže to musíme urobiť ručne:

zábava `Druhá mocnina čísla by sa mala rovnať tomu číslu, ktoré je násobené samým sebou () {Assertions.assertAll (Executable {Assertions.assertEquals (1, calculator.square (1))}, Executable {Assertions.assertEquals (4, kalkulačka) .square (2))}, Executable {Assertions.assertEquals (9, calculator.square (3))})}

3.3. Dodávatelia pre pravdivé a nepravdivé testy

Príležitostne chceme vyskúšať, či niektoré volanie vráti a pravda alebo nepravdivé hodnotu. Historicky by sme túto hodnotu vypočítali a zavolali tvrdiť Pravda alebo tvrdiťFaloš podľa potreby. JUnit 5 umožňuje namiesto toho poskytnúť lambdu, ktorá vráti kontrolovanú hodnotu.

Kotlin nám umožňuje prejsť lambdou rovnakým spôsobom, aký sme videli vyššie pri testovaní výnimiek. Môžeme tiež odovzdať odkazy na metódy. To je obzvlášť užitočné pri testovaní návratovej hodnoty nejakého existujúceho objektu, ako to robíme tu pomocou List.isEmpty:

@Test fun `isEmpty by mal vrátiť true pre prázdne zoznamy` () {val list = listOf () Assertions.assertTrue (list :: isEmpty)}

3.4. Dodávatelia pre chybové správy

V niektorých prípadoch to chceme poskytnúť našu vlastnú chybovú správu sa zobrazí pri zlyhaní tvrdenia namiesto predvoleného.

Často sú to jednoduché struny, ale niekedy môžeme chcieť použiť reťazec, ktorého výpočet je drahý. V JUnit 5 môžeme poskytnite lambdu na výpočet tohto reťazca, a to je iba na neúspech namiesto toho, aby boli vypočítané vopred.

To môže pomôcť zrýchlite testy a znížite časy zostavenia. Funguje to úplne rovnako, ako sme to videli predtým:

@Test fun `3 sa rovná 4` () {Assertions.assertEquals (3, 4) {" tri sa nerovná štyrom "}}

4. Testy založené na dátach

Jedným z veľkých vylepšení JUnit 5 je natívna podpora testov založených na dátach. Títo rovnako dobre funguj aj v Kotline, a použitie funkčných mapovaní na zbierky môže uľahčujú čítanie a údržbu našich testov.

4.1. Metódy TestFactory

Najjednoduchší spôsob, ako zvládnuť testy založené na dátach, je použitie @TestFactory anotácia. Toto nahrádza @Test anotácia a metóda vráti určitú zbierku súborov DynamicNode inštancie - zvyčajne sa vytvárajú volaním DynamicTest.dynamicTest.

V Kotline to funguje úplne rovnako a my môžeme odovzdajte lambdu čistejším spôsobom opäť, ako sme videli skôr:

@TestFactory fun testSquares () = listOf (DynamicTest.dynamicTest ("keď vypočítam 1 ^ 2, potom dostanem 1") {Assertions.assertEquals (1, calculator.square (1))}, DynamicTest.dynamicTest ("keď vypočítam 2 ^ 2 potom dostanem 4 ") {Assertions.assertEquals (4, calculator.square (2))}, DynamicTest.dynamicTest (" keď vypočítam 3 ^ 2, potom dostanem 9 ") {Assertions.assertEquals (9, kalkulačka) .square (3))})

Môžeme však urobiť lepšie ako toto. Môžeme ľahko zostavte náš zoznam vykonaním funkčného mapovania na jednoduchom vstupnom zozname údajov:

@TestFactory fun testSquares () = listOf (1 až 1, 2 až 4, 3 až 9, 4 až 16, 5 až 25) .map {(vstup, očakáva sa) -> DynamicTest.dynamicTest ("keď vypočítam vstup $ ^ 2 potom dostanem $ expect ") {Assertions.assertEquals (očakáva sa, calculator.square (vstup))}}

Hneď môžeme do vstupného zoznamu ľahko pridať ďalšie testovacie prípady a automaticky sa do nich pridajú testy.

Môžeme tiež vytvorte zoznam vstupov ako pole triedy a zdieľať ich medzi viacerými testami:

private val squaresTestData = listOf (1 až 1, 2 až 4, 3 až 9, 4 až 16, 5 až 25) 
@TestFactory fun testSquares () = squaresTestData .map {(vstup, očakávaný) -> DynamicTest.dynamicTest ("keď vypočítam $ vstup ^ 2, potom dostanem $ očakávaný") {Assertions.assertEquals (očakáva sa, calculator.square (vstup) )}}
@TestFactory fun testSquareRoots () = squaresTestData .map {(očakáva sa, vstup) -> DynamicTest.dynamicTest ("keď vypočítam druhú odmocninu vstupu $, potom dostanem očakávané $") {Assertions.assertEquals (očakáva sa, calculator.squareRoot ( vstup))}}

4.2. Parametrizované testy

Existujú experimentálne rozšírenia na JUnit 5 umožniť jednoduchšie spôsoby zápisu parametrizovaných testov. To sa deje pomocou @ParameterizedTest anotácia z org.junit.jupiter: junit-jupiter-params závislosť:

 org.junit.jupiter junit-jupiter-params 5.0.0 

Najnovšiu verziu nájdete na serveri Maven Central.

The @ MetodSource anotácia nám umožňuje produkovať testovacie parametre volaním statickej funkcie ktorý sa nachádza v rovnakej triede ako test. To je možné ale u Kotlina to nie je zrejmé. Musíme Použi @JvmStatic anotácia vo vnútri a sprievodný objekt:

@ParameterizedTest @MethodSource ("squares") zábavný testSquares (vstup: Int, očakávaný: Int) {Assertions.assertEquals (očakávaný, vstup * vstup)} sprievodný objekt {@JvmStatic zábavné squares () = listOf (Arguments.of (1, 1), Argumenty.of (2, 4))}

To tiež znamená, že metódy použité na výrobu parametrov musia byť odvtedy všetky pohromade môžeme mať iba jediný sprievodný objekt na triedu.

Všetky ostatné spôsoby použitia parametrizovaných testov fungujú v Kotline úplne rovnako ako v prostredí Java. @CsvSource je tu osobitná poznámka, pretože ju môžeme použiť namiesto @ MetodSource pre jednoduché údaje z testov väčšinu času, aby boli naše testy čitateľnejšie:

@ParameterizedTest @CsvSource ("1, 1", "2, 4", "3, 9") zábavné testSquares (vstup: Int, očakávaný: Int) {Assertions.assertEquals (očakávaný, vstup * vstup)}

5. Označené testy

Kotlinský jazyk v súčasnosti neumožňuje opakované anotácie o triedach a metódach. Vďaka tomu je používanie značiek o niečo podrobnejšie, ako to od nás vyžaduje zabaľte ich do @Tagy anotácia:

@Tags (Tag ("slow"), Tag ("logarithms")) @Test fun `Prihlásenie do základne 2 z 8 by sa malo rovnať 3` () {Assertions.assertEquals (3.0, calculator.log (2, 8) )}

To sa vyžaduje aj v prostredí Java 7 a JUnit 5 ho už plne podporuje.

6. Zhrnutie

JUnit 5 pridáva niekoľko výkonných testovacích nástrojov, ktoré môžeme použiť. Tieto takmer všetky fungujú perfektne s jazykom Kotlin, aj keď v niektorých prípadoch s mierne odlišnou syntaxou, ako vidíme v ekvivalentoch Java.

Tieto zmeny v syntaxi sa však pri použití Kotlin často ľahšie čítajú a pracuje sa s nimi.

Príklady všetkých týchto funkcií nájdete na GitHub.


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