Prelazak s JUnit 4 na JUnit 5

1. Pregled

U ovom ćemo članku vidjeti kako možemo preći s JUnit 4 na najnovije izdanje JUnit 5 - s pregledom razlika između dvije verzije knjižnice.

Opće smjernice o korištenju JUnit 5 potražite ovdje.

2. JUNIT 5 Prednosti

Počnimo s prethodnom verzijom - JUnit 4 ima neka jasna ograničenja:

  • Čitav okvir bio je sadržan u jednoj knjižnici jar. Cijelu knjižnicu treba uvesti čak i kad je potrebna samo određena značajka. U JUnit 5 dobivamo više detalja i možemo uvesti samo ono što je potrebno
  • Jedan trkač može istodobno provoditi testove samo u JUnit 4 (npr. SpringJUnit4ClassRunner ili Parametarizirano ). JUnit 5 omogućava istodobnom radu više trkača
  • JUnit 4 nikad nije napredovao dalje od Jave 7, propustivši mnoge značajke Jave 8. JUnit 5 dobro koristi značajke Java 8

Ideja koja stoji iza JUnit 5 bila je u potpunosti prepisati JUnit 4 kako bi se riješio većina ovih nedostataka.

3. Razlike

JUnit 4 podijeljen je u module koji čine JUnit 5:

  • JUnit platforma - ovaj modul obuhvaća sve okvire proširenja koji bi nas mogli zanimati za izvršavanje testa, otkrivanje i izvještavanje
  • JUnit Vintage - ovaj modul omogućuje povratnu kompatibilnost s JUnit 4 ili čak JUnit 3

3.1. Bilješke

JUnit 5 dolazi s važnim promjenama unutar svojih bilješki. Najvažnija je ona koju više ne možemo koristiti @Test napomena za specificiranje očekivanja.

The očekivano parametar u JUnit 4:

@Test (očekuje se = Exception.class) javna praznina shouldRaiseAnException () baca iznimku {// ...}

Sada se možemo poslužiti metodom assertThrows:

javna praznina shouldRaiseAnException () baca Exception {Assertions.assertThrows (Exception.class, () -> {// ...}); }

The pauza atribut u JUnit 4:

@Test (timeout = 1) javna praznina shouldFailBecauseTimeout () baca InterruptedException {Thread.sleep (10); }

Sada, assertTimeout metoda u JUnit 5:

@Test public void shouldFailBecauseTimeout () baca InterruptedException {Assertions.assertTimeout (Duration.ofMillis (1), () -> Thread.sleep (10)); }

Ostale bilješke koje su promijenjene unutar JUnit-a 5:

  • @Prije napomena se preimenuje u @BeforeEach
  • @Nakon napomena se preimenuje u @AfterEach
  • @BeforeClass napomena se preimenuje u @BeforeAll
  • @Nakon nastave napomena se preimenuje u @Nakon svega
  • @Zanemariti napomena se preimenuje u @Onemogućeno

3.2. Tvrdnje

Sada možemo pisati poruke tvrđenja lambda-om u JUnit-u 5, omogućujući lijenoj procjeni da preskoči složenu konstrukciju poruke dok ne zatreba:

@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "Brojevi" + 2 + "i" + 3 + "nisu jednaki!"); }

Tvrdnje također možemo grupirati u JUnit 5:

@Test javna praznina shouldAssertAllTheGroup () {Popis popisa = Arrays.asList (1, 2, 4); Assertions.assertAll ("Popis nije inkrementalni", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }

3.3. Pretpostavke

Novi Pretpostavke razred je sada u org.junit.jupiter.api.Pretpostavke. JUnit 5 u potpunosti podržava postojeće metode pretpostavki u JUnit 4, a također dodaje skup novih metoda koje omogućavaju pokretanje nekih tvrdnji samo u određenim scenarijima:

@Test public void whenEnvironmentIsWeb_thenUrlsShouldStartWithHttp () {pretpostavljajućiThat ("WEB" .equals (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (adresa));}); }

3.4. Označavanje i filtriranje

U JUnit-u 4 mogli smo grupirati testove pomoću @Kategorija bilješka. Uz JUnit 5, @Kategorija napomena se zamjenjuje s @Označiti napomena:

@Tag ("annotations") @Tag ("junit5") @RunWith (JUnitPlatform.class) javna klasa AnnotationTestExampleTest {/*...*/}

Možemo uključiti / isključiti određene oznake pomoću maven-surefire-plugin:

   maven-surefire-plugin junit5 

3.5. Nove bilješke za izvođenje testova

The @RunWith je korišten za integraciju konteksta testa s drugim okvirima ili za promjenu ukupnog tijeka izvršavanja u test slučajevima u JUnit 4.

S JUnit 5 sada možemo koristiti @ExtendWith napomena za pružanje slične funkcionalnosti.

Kao primjer, za korištenje značajki Spring u JUnit 4:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) javna klasa SpringExtensionTest {/*...*/}

Sada je u JUnit 5 jednostavno proširenje:

@ExtendWith (SpringExtension.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) javna klasa SpringExtensionTest {/*...*/} 

3.6. Bilješke o novim pravilima ispitivanja

U JUNITU 4, @Pravilo i @ClassRule napomene su korištene za dodavanje posebne funkcionalnosti testovima.

U JUnit 5. možemo reproducirati istu logiku koristeći @ExtendWith bilješka.

Na primjer, recimo da u JUnit 4 imamo prilagođeno pravilo za pisanje tragova dnevnika prije i nakon testa:

javna klasa TraceUnitTestRule implementira TestRule {@Override primjenjuje se javna izjava (baza iskaza, opis opisa) {return new Statement () {@Override public void evaluacija () baca bacanje {// Prije i nakon praćenja evaluacije ovdje ...}}; }}

I implementiramo ga u testni paket:

@Rule public TraceUnitTestRule traceRuleTests = new TraceUnitTestRule (); 

U JUnit 5 isto možemo napisati na puno intuitivniji način:

javna klasa TraceUnitExtension implementira AfterEachCallback, BeforeEachCallback {@Override public void beforeEach (TestExtensionContext context) baca izuzetak {// ...} @Override public void afterEach (TestExtensionContext context) baca izuzetak {// ...}}

Korištenje JUnit-a 5 AfterEachCallback i BeforeEachCallback sučelja dostupna u paketu org.junit.jupiter.api.extension, ovo pravilo lako implementiramo u testni paket:

@RunWith (JUnitPlatform.class) @ExtendWith (TraceUnitExtension.class) javna klasa RuleExampleTest {@Test public void whenTracingTests () {/*...*/}}

3.7. JUNIT 5 Vintage

JUnit Vintage pomaže u migraciji JUnit testova pokretanjem testova JUnit 3 ili JUnit 4 unutar konteksta JUnit 5.

Možemo ga koristiti uvozom JUnit Vintage Engine:

 test org.junit.vintage junit-vintage-engine $ {junit5.vintage.version} 

4. Zaključak

Kao što smo vidjeli u ovom članku, JUnit 5 je modularan i moderan pristup JUnit 4 okviru. Uveli smo glavne razlike između ove dvije verzije i nagovijestili kako prelaziti s jedne na drugu.

Potpuna implementacija ovog vodiča može se naći u preko na GitHub-u.