JUnit 5 za programere Kotlina

1. Uvod

Novo objavljeni JUnit 5 sljedeća je verzija dobro poznatog okvira za testiranje Jave. Ova verzija uključuje brojne značajke koje posebno ciljaju funkcionalnost uvedenu u Javi 8 - prvenstveno se temelji na upotrebi lambda izraza.

U ovom kratkom članku pokazat ćemo koliko je isti alat radi s jezikom Kotlin.

2. Jednostavni testovi JUnit 5

U najjednostavnijem obliku, test JUnit 5 napisan u Kotlinu djeluje točno onako kako bi se očekivalo. Napisujemo ispitnu klasu, a metode ispitivanja označavamo s @Test napomena, napišite naš kôd i izvedite tvrdnje:

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

Ovdje sve jednostavno ide iz kutije. Možemo se poslužiti standardom @Test, @BeforeAll, @BeforeEach, @AfterEach, i @Nakon svega bilješke. Također možemo komunicirati s poljima u testnoj klasi potpuno isto kao i na Javi.

Imajte na umu da se potreban uvoz razlikuje, i radimotvrdnje pomoću Tvrdnje razred umjesto Tvrditi razred. Ovo je standardna promjena za JUnit 5 i nije specifična za Kotlin.

Prije nego što nastavimo dalje, promijenimo naziv i upotrebu testa bidentifikatori acktick u Kotlinu:

@Test fun `Dodavanje 1 i 3 trebalo bi biti jednako 4` () {Assertions.assertEquals (4, calculator.add (1, 3))}

Sad je puno čitljiviji! U Kotlinu možemo deklarirati sve varijable i funkcije pomoću povratnih znakova, ali to se ne preporučuje za uobičajene slučajeve upotrebe.

3. Napredne tvrdnje

JUnit 5 dodaje neke napredne tvrdnje zarad s lambdama. Oni u Kotlinu rade isto kao i na Javi, ali ih treba izraziti na malo drugačiji način zbog načina na koji jezik funkcionira.

3.1. Utvrđivanje iznimaka

JUnit 5 dodaje tvrdnju kada se očekuje da poziv dovede do iznimke. Možemo testirati da određeni poziv - umjesto bilo kojeg poziva u metodi - baca očekivanu iznimku. Možemo čak tvrditi i o samoj iznimci.

U Javi bismo u poziv proslijedili lambda-u Tvrdnje.assertThrows. To isto radimo u Kotlinu, ali možemo čine kôd čitljivijim dodavanjem bloka na kraj poziva za tvrdnju:

@Test zabava `Dijeljenje s nulom treba baciti DivideByZeroException` () {val iznimka = Assertions.assertThrows (DivideByZeroException :: class.java) {calculator.divide (5, 0)} Assertions.assertEquals (5, iznimka.brojnik)}

Ovaj kod radi potpuno isto kao Java ekvivalent, ali lakši je za čitanje, budući da ne trebamo prolaziti lambdu unutar zagrada gdje zovemo assertThrows funkcija.

3.2. Višestruke tvrdnje

JUnit 5 dodaje mogućnost istodobno izvoditi više tvrdnji, te će ih sve procijeniti i izvijestiti o svim kvarovima.

To nam omogućuje da prikupimo više informacija u jednom testnom radu, a ne da budemo prisiljeni ispraviti jednu pogrešku samo da bismo pogodili sljedeću. Da bismo to učinili, zovemo Tvrdnje.assertAll, prolazeći u proizvoljnom broju lambda.

U Kotlinu, moramo ovo riješiti malo drugačije. The funkcija zapravo traje a varargi parametar tipa Izvršno.

Trenutno ne postoji podrška za automatsko lijevanje lambda-e na funkcionalno sučelje, pa to moramo učiniti ručno:

zabava `Kvadrat broja trebao bi biti jednak onom broju pomnoženom u sebi` () {Assertions.assertAll (Izvršno {Assertions.assertEquals (1, calculator.square (1))}, Izvršno {Assertions.assertEquals (4, kalkulator) .square (2))}, izvršna {Assertions.assertEquals (9, calculator.square (3))})}

3.3. Dobavljači za istinita i lažna ispitivanja

Povremeno želimo provjeriti vraća li se neki poziv a pravi ili lažno vrijednost. Povijesno bismo izračunali ovu vrijednost i pozvali assertTrue ili assertFalse prema potrebi. JUnit 5 omogućuje da se umjesto toga pruži lambda koja vraća vrijednost koja se provjerava.

Kotlin nam omogućuje da prođemo u lambdi na isti način kao što smo vidjeli gore za testiranje iznimaka. Također možemo proslijediti reference metoda. To je posebno korisno kada se testira povratna vrijednost nekog postojećeg objekta kao što to ovdje koristimo List.isEmpty:

@Test fun `isEmpty treba vratiti true za prazne popise` () {val list = listOf () Assertions.assertTrue (list :: isEmpty)}

3.4. Dobavljači za poruke o kvaru

U nekim slučajevima to želimo pružite vlastitu poruku o pogrešci biti prikazan na pogrešci tvrdnje umjesto na zadanoj.

Često su to jednostavne žice, ali ponekad bismo mogli htjeti upotrijebiti niz koji je skup za izračunavanje. U JUNITU 5 možemo osigurati lambda za izračunavanje ovog niza, I to je pozvan samo na neuspjeh umjesto da se računa unaprijed.

Ovo može pomoći ubrzajte testove i smanjite vrijeme izrade. Ovo djeluje potpuno isto kao što smo vidjeli prije:

@Test zabava `3 jednako je 4` () {Assertions.assertEquals (3, 4) {" Tri nije jednako četiri "}}

4. Testovi na temelju podataka

Jedno od velikih poboljšanja u JUnit 5 je nativna podrška za testove na temelju podataka. Ovi jednako dobro rade u Kotlinu, a upotreba funkcionalnih preslikavanja na zbirkama može olakšajte čitanje i održavanje naših testova.

4.1. TestFactory metode

Najlakši način za rukovanje testovima na temelju podataka je pomoću @TestFactory bilješka. Ovo zamjenjuje @Test i metoda vraća neku zbirku DynamicNode instance - obično kreirane pozivanjem DynamicTest.dynamicTest.

Ovo u Kotlinu djeluje potpuno isto, a mi možemo proći u lambdi na čišći način opet, kao što smo vidjeli ranije:

@TestFactory fun testSquares () = listOf (DynamicTest.dynamicTest ("kad izračunam 1 ^ 2 onda dobijem 1") {Assertions.assertEquals (1, calculator.square (1))}, DynamicTest.dynamicTest ("kada izračunam 2 ^ 2 tada dobivam 4 ") {Assertions.assertEquals (4, calculator.square (2))}, DynamicTest.dynamicTest (" kada izračunam 3 ^ 2 onda dobivam 9 ") {Assertions.assertEquals (9, kalkulator .kvadrat (3))})

Ipak možemo i bolje od ovoga. Možemo lako izradite naš popis izvođenjem nekog funkcionalnog mapiranja na jednostavnom ulaznom popisu podataka:

@TestFactory fun testSquares () = listOf (1 do 1, 2 do 4, 3 do 9, 4 do 16, 5 do 25) .map {(ulaz, očekuje se) -> DynamicTest.dynamicTest ("kada izračunam $ input ^ 2 tada dobivam očekivano $ ") {Assertions.assertEquals (očekuje se, calculator.square (input))}}

Odmah možemo lako dodati više test slučajeva na popis za unos i automatski će dodati testove.

Možemo i mi stvoriti popis unosa kao polje klase i podijelite ga između više testova:

private val squaresTestData = listOf (1 do 1, 2 do 4, 3 do 9, 4 do 16, 5 do 25) 
@TestFactory fun testSquares () = squaresTestData .map {(ulaz, očekuje se) -> DynamicTest.dynamicTest ("kad izračunam $ input ^ 2 onda dobijem $ očekivano") {Assertions.assertEquals (očekuje se, calculator.square (input) )}}
@TestFactory zabavni testSquareRoots () = squaresTestData .map {(očekuje se, unos) -> DynamicTest.dynamicTest ("kad izračunam kvadratni korijen od $ input onda dobijem $ očekivano") {Assertions.assertEquals (očekuje se, calculator.squareRoot ( unos))}}

4.2. Parametarska ispitivanja

Tamo su eksperimentalna proširenja za JUnit 5 kako bi se omogućili lakši načini pisanja parametriziranih testova. To se radi pomoću @ParameterizedTest napomena iz org.junit.jupiter: junit-jupiter-params ovisnost:

 org.junit.jupiter junit-jupiter-params 5.0.0 

Najnoviju verziju možete pronaći na Maven Central.

The @MethodSource anotacija nam omogućuje proizvesti parametre ispitivanja pozivanjem statičke funkcije koji se nalazi u istoj klasi kao i test. To je moguće, ali nije očito u Kotlinu. Mi moramo koristiti @JvmStatic bilješka unutar a popratni objekt:

@ParameterizedTest @MethodSource ("kvadrati") fun testSquares (ulaz: Int, očekuje se: Int) {Assertions.assertEquals (očekuje se, ulaz * ulaz)} prateći objekt {@JvmStatic fun squares () = listOf (Arguments.of (1, 1), Argumenti.f (2, 4))}

To također znači da metode korištene za izradu parametara moraju od tada biti zajedno možemo imati samo jednog objekt pratilac po razredu.

Svi ostali načini korištenja parametriziranih testova u Kotlinu rade potpuno isto kao i na Javi. @CsvSource ovdje je posebno važno, jer to možemo koristiti umjesto @MethodSource za jednostavne podatke o testovima većinu vremena kako bi naši testovi bili čitljiviji:

@ParameterizedTest @CsvSource ("1, 1", "2, 4", "3, 9") fun testSquares (ulaz: Int, očekuje se: Int) {Assertions.assertEquals (očekuje se, ulaz * ulaz)}

5. Označeni testovi

Kotlinski jezik trenutno ne dopušta ponovljene napomene na časovima i metodama. To upotrebu oznaka čini malo detaljnijom, kao što se od nas traži zamotajte ih u @Oznake napomena:

@Tags (Tag ("slow"), Tag ("logaritmi")) @Test fun `Prijava na bazu 2 od 8 treba biti jednaka 3` () {Assertions.assertEquals (3.0, calculator.log (2, 8) )}

To je također potrebno u Javi 7, a JUnit 5 to već u potpunosti podržava.

6. Sažetak

JUnit 5 dodaje neke moćne alate za testiranje koje možemo koristiti. Oni gotovo svi savršeno dobro rade s jezikom Kotlin, iako u nekim slučajevima s malo drugačijom sintaksom nego što je to slučaj u Java ekvivalentima.

No, često je ove promjene u sintaksi lakše čitati i raditi s njima kada se koristi Kotlin.

Primjeri svih ovih značajki mogu se naći na GitHubu.


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