Vodič za JUnit 5

1. Pregled

JUnit je jedan od najpopularnijih okvira za testiranje jedinica u ekosustavu Java. Verzija JUnit 5 sadrži brojne uzbudljive inovacije, s cilj podržati nove značajke u Javi 8 i novijim verzijama, kao i omogućavanje mnogih različitih stilova testiranja.

2. Ovisnosti Mavena

Postavljanje JUnit 5.x.0 prilično je jednostavno, trebamo dodati sljedeću ovisnost u našu pom.xml:

 org.junit.jupiter junit-jupiter-motor 5.1.0 test 

Važno je napomenuti da ova verzija zahtijeva Java 8 za rad.

Štoviše, sada postoji izravna podrška za pokretanje Unit testova na platformi JUnit u Eclipseu, kao i na IntelliJ-u. Možete, naravno, izvoditi i testove koristeći cilj Maven testa.

S druge strane, IntelliJ prema zadanim postavkama podržava JUnit 5. Stoga je pokretanje JUnit 5 na IntelliJ-u prilično jednostavno, jednostavno Desni klik -> Pokreni ili Ctrl-Shift-F10.

3. Arhitektura

JUnit 5 sastoji se od nekoliko različitih modula iz tri različita podprojekta:

3.1. JUnit platforma

Platforma je odgovorna za pokretanje okvira za testiranje na JVM-u. Definira stabilno i moćno sučelje između JUnit-a i njegovog klijenta, poput alata za izgradnju.

Konačni cilj je kako se njegovi klijenti lako integriraju s JUnit-om u otkrivanju i izvršavanju testova.

Također definira API TestEngine za razvoj okvira za testiranje koji se izvodi na platformi JUnit. Po tome možete dodati biblioteke za testiranje trećih strana, izravno u JUnit, primjenom prilagođenog TestEngine.

3.2. JUNITI Jupiter

Ovaj modul uključuje nove modele programiranja i proširenja za pisanje testova u JUnit 5. Nove bilješke u usporedbi s JUnit 4 su:

  • @TestFactory - označava metodu koja je tvornica ispitivanja za dinamička ispitivanja
  • @DisplayName - definira prilagođeno ime za prikaz za klasu ispitivanja ili metodu ispitivanja
  • @Nostirano - označava da je označena klasa ugniježđena, ne-statična ispitna klasa
  • @Označiti - deklarira oznake za filtriranje testova
  • @ExtendWith - koristi se za registraciju prilagođenih proširenja
  • @BeforeEach - označava da će se označena metoda izvršiti prije svake ispitne metode (prethodno @Prije)
  • @AfterEach - označava da će se označena metoda izvršiti nakon svake ispitne metode (prethodno @Nakon)
  • @BeforeAll - označava da će se označena metoda izvršiti prije svih metoda ispitivanja u trenutnoj klasi (prethodno @BeforeClass)
  • @Nakon svega - označava da će se označena metoda izvršiti nakon svih metoda ispitivanja u trenutnoj klasi (prethodno @Nakon nastave)
  • @Omogući - koristi se za onemogućavanje klase ili metode ispitivanja (prethodno @Zanemariti)

3.3. JUnit Vintage

Podržava pokretanje testova temeljenih na JUnit 3 i JUnit 4 na platformi JUnit 5.

4. Osnovne bilješke

Kako bismo razgovarali o novim bilješkama, odjeljak smo podijelili u sljedeće skupine odgovorne za izvršavanje: prije testova, tijekom testova (neobavezno) i nakon testova:

4.1. @BeforeAll i @BeforeEach

Ispod je primjer jednostavnog koda koji će se izvršiti prije glavnih test slučajeva:

@BeforeAll static void setup () {log.info ("@ BeforeAll - izvršava se jednom prije svih metoda ispitivanja u ovoj klasi"); } @BeforeEach void init () {log.info ("@ BeforeEach - izvršava se prije svake metode ispitivanja u ovoj klasi"); }

Važno je napomenuti da je metoda s @BeforeAll napomena mora biti statična, inače se kod neće prevesti.

4.2. @DisplayName i @Onemogućeno

Prijeđimo na nove metode koje se ne uključuju:

@DisplayName ("Jedan test uspješan") @Test void testSingleSuccessTest () {log.info ("Uspjeh"); } @Test @Disabled ("Još nije implementirano") void testShowSomething () {}

Kao što vidimo, možemo promijeniti ime za prikaz ili onemogućiti metodu komentarom, koristeći nove bilješke.

4.3. @AfterEach i @Nakon svega

Na kraju, razgovarajmo o metodama povezanim s operacijama nakon izvođenja testova:

@AfterEach void tearDown () {log.info ("@ AfterEach - izvršava se nakon svake metode ispitivanja."); } @AfterAll static void done () {log.info ("@ AfterAll - izvršeno nakon svih metoda ispitivanja."); }

Napominjemo tu metodu s @Nakon svega također treba biti statična metoda.

5. Tvrdnje i pretpostavke

JUnit 5 pokušava u potpunosti iskoristiti nove značajke Java 8, posebno lambda izraze.

5.1. Tvrdnje

Tvrdnje su premještene na org.junit.jupiter.api.Tvrdnje i znatno su poboljšani. Kao što je ranije spomenuto, lambde sada možete koristiti u tvrdnjama:

@Test void lambdaExpressions () {assertTrue (Stream.of (1, 2, 3) .stream () .mapToInt (i -> i) .sum ()> 5, () -> "Zbir treba biti veći od 5" ); }

Iako je gornji primjer trivijalan, jedna od prednosti korištenja lambda izraza za poruku tvrdnje jest ta da se lijeno procjenjuje, što može uštedjeti vrijeme i resurse ako je izgradnja poruke skupa.

Također je sada moguće grupirati tvrdnje sa assertAll () koja će prijaviti sve neuspjele tvrdnje unutar grupe s MultipleFailuresError:

 @Test void groupAssertions () {int [] brojevi = {0, 1, 2, 3, 4}; assertAll ("brojevi", () -> assertEquals (brojevi [0], 1), () -> assertEquals (brojevi [3], 3), () -> assertEquals (brojevi [4], 1)); }

To znači da je sada sigurnije iznositi složenije tvrdnje, jer ćete moći odrediti točno mjesto bilo kojeg neuspjeha.

5.2. Pretpostavke

Pretpostavke se koriste za izvođenje testova samo ako su ispunjeni određeni uvjeti. To se obično koristi za vanjske uvjete koji su potrebni za pravilno provođenje testa, ali koji nisu izravno povezani s onim što se testira.

Pretpostavku možete izjaviti s pretpostaviti istinu (), takeFalse (), i pod pretpostavkomThat ().

@Test void trueAssumption () {pretpostaviti Istina (5> 1); assertEquals (5 + 2, 7); } @Test void falseAssumption () {takeFalse (5 assertEquals (2 + 2, 4)); }

Ako pretpostavka zakaže, a TestAbortedException se baci i test se jednostavno preskoči.

Pretpostavke također razumiju lambda izraze.

6. Ispitivanje iznimke

Postoje dva načina testiranja iznimki u JUnit 5. Oba se mogu implementirati pomoću assertThrows () metoda:

@Test void shouldThrowException () {Throwable iznimka = assertThrows (UnsupportedOperationException.class, () -> {baciti novi UnsupportedOperationException ("Nije podržano");}); assertEquals (iznimka.getMessage (), "Nije podržano"); } @Test void assertThrowsException () {Niz str = null; assertThrows (IllegalArgumentException.class, () -> {Integer.valueOf (str);}); }

Prvi se primjer koristi za provjeru više detalja izbačene iznimke, a drugi samo provjerava vrstu iznimke.

7. Probni apartmani

Da bismo nastavili s novim značajkama JUnit 5, pokušat ćemo upoznati koncept agregiranja više testnih klasa u testnom paketu kako bismo ih mogli pokrenuti zajedno. JUnit 5 sadrži dvije bilješke: @SelectPackages i @SelectClasses za stvaranje testnih kompleta.

Imajte na umu da u ovoj ranoj fazi većina IDE-a ne podržava te značajke.

Pogledajmo prvi:

@RunWith (JUnitPlatform.class) @SelectPackages ("com.baeldung") javna klasa AllUnitTest {}

@SelectPackage koristi se za određivanje naziva paketa koji će se odabrati prilikom izvođenja test paketa. U našem primjeru pokrenut će sve testove. Druga napomena, @SelectClasses, koristi se za određivanje klasa koje će se odabrati prilikom izvođenja probnog paketa:

@RunWith (JUnitPlatform.class) @SelectClasses ({AssertionTest.class, AssumptionTest.class, ExceptionTest.class}) javna klasa AllUnitTest {}

Na primjer, gornja klasa stvorit će paket koji sadrži tri testne klase. Napominjemo da satovi ne moraju biti u jednom paketu.

8. Dinamička ispitivanja

Posljednja tema koju želimo predstaviti je značajka dinamičkih testova JUnit 5, koja omogućuje deklariranje i pokretanje testnih slučajeva generiranih u vrijeme izvođenja. Suprotno statičkim testovima koji definiraju fiksni broj testnih slučajeva u vrijeme sastavljanja, dinamički testovi omogućuju nam dinamičko definiranje testnih slučajeva u vrijeme izvođenja.

Dinamički testovi mogu se generirati tvorničkom metodom označenom s @TestFactory. Pogledajmo primjer koda:

@TestFactory public Stream translateDynamicTestsFromStream () {return in.stream () .map (word -> DynamicTest.dynamicTest ("Test translate" + word, () -> {int id = in.indexOf (word); assertEquals (out. get (id), translate (word));})); }

Ovaj je primjer vrlo jednostavan i lak za razumjeti. Riječi želimo prevesti pomoću dvije ArrayList, imenovan u i van, odnosno. Tvornička metoda mora vratiti a Stream, Kolekcija, Iterativ, ili Iterator. U našem slučaju odabiremo Javu 8 Potok.

Imajte na umu da @TestFactory metode ne smiju biti privatne ili statične. Broj testova je dinamičan i ovisi o ArrayList veličina.

9. Zaključak

Tekst je bio brzi pregled promjena koje dolaze s JUnit 5.

Možemo vidjeti da JUnit 5 ima veliku promjenu u svojoj arhitekturi koja se odnosi na pokretač platformi, integraciju s alatom za izgradnju, IDE-om, drugim okvirima za testiranje jedinice, itd. Štoviše, JUnit 5 je više integriran s Javom 8, posebno s konceptima Lambdas i Stream .

Primjeri korišteni u ovom članku mogu se naći u projektu GitHub.