Migrálás a 4. JUnitről az 5. JUnitre

1. Áttekintés

Ebben a cikkben megnézzük, hogyan lehet áttérni a JUnit 4-ről a legújabb JUnit 5 kiadásra - áttekintve a könyvtár két verziója közötti különbségeket.

A JUnit 5 használatára vonatkozó általános irányelveket itt olvashatja el.

2. JUnit 5 előnyei

Kezdjük az előző verzióval - a JUnit 4 rendelkezik néhány egyértelmű korlátozással:

  • A teljes keretet egyetlen edénykönyvtár tartalmazta. Az egész könyvtárat akkor is importálni kell, ha csak egy adott szolgáltatásra van szükség. Az 5. JUnit-ben nagyobb részletességet kapunk, és csak a szükségeseket tudjuk importálni
  • Egy tesztfutó egyszerre csak a 4. JUnit-ben hajthat végre teszteket (pl. SpringJUnit4ClassRunner vagy Paraméterezett ). A JUnit 5 lehetővé teszi több futó számára, hogy egyszerre dolgozzanak
  • A JUnit 4 soha nem lépett túl a Java 7-en, sok funkciót kihagyva a Java 8-ból. A JUnit 5 jól használja a Java 8 szolgáltatásait

A JUnit 5 mögött az az ötlet állt, hogy a JUnit 4-et teljesen átírja, hogy megoldja ezeket a hátrányokat.

3. Különbségek

A 4. JUnit fel lett osztva modulokra, amelyek a JUnit 5-öt tartalmazzák:

  • JUnit Platform - ez a modul átfogja az összes kiterjesztés keretrendszert, amely érdekelhet minket a tesztek végrehajtásában, a felfedezésben és a jelentésekben
  • JUnit Vintage - ez a modul lehetővé teszi a visszamenőleges kompatibilitást a JUnit 4 vagy akár a JUnit 3 készülékkel

3.1. Megjegyzések

A JUnit 5 fontos változásokkal jár az annotációiban. A legfontosabb az, hogy már nem tudjuk használni @Teszt kommentár az elvárások meghatározásához.

A várt paraméter a 4. JUnit-ben:

A @Test (várható = Exception.class) public void shouldRaiseAnException () dobja a Kivételt {// ...}

Most használhatunk egy módszert assertThrows:

public void shouldRaiseAnException () dobja a Kivételt {Assertions.assertThrows (Exception.class, () -> {// ...}); }

A időtúllépés attribútum a 4. JUnit-ben:

@Test (timeout = 1) public void shouldFailBecauseTimeout () dobja az InterruptedException {Thread.sleep (10); }

Most a assertTimeout módszer az 5. JUnit-ben:

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

Egyéb megjegyzések, amelyeket az 5. JUnit egységen belül módosítottak:

  • @Előtt az annotációt átnevezik @BeforeEach
  • @Utána az annotációt átnevezik @AfterEach
  • @Óra előtt az annotációt átnevezik @BeforeAll
  • @Óra után az annotációt átnevezik @Végül
  • @Figyelmen kívül hagyni az annotációt átnevezik @Tiltva

3.2. Állítások

Most állítási üzeneteket írhatunk egy lambdába az 5. JUnit készülékben, lehetővé téve a lusta értékelés számára, hogy a komplex üzenetek felépítését átugorja, amíg szükséges:

@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "Számok" + 2 + "és" + 3 + "nem egyenlőek!"); }

Az állításokat az 5. JUnit-ben is csoportosíthatjuk:

@Test public void shouldAssertAllTheGroup () {List list = Arrays.asList (1, 2, 4); Assertions.assertAll ("A lista nem növekményes", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }

3.3. Feltételezések

Az új Feltételezések osztály most van org.junit.jupiter.api.Feltevések. Az 5. JUnit teljes mértékben támogatja a 4. JUnit meglévő feltételezési módszereit, és új metódusokat is hozzáad, hogy egyes állításokat csak meghatározott esetekben futtassanak:

@Test public void whenEnvironmentIsWeb_thenUrlsShouldStartWithHttp () {feltéve, hogy ("WEB" .egyenlő (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (cím));}); }

3.4. Címkézés és szűrés

A JUnit 4-ben csoportosíthatjuk a teszteket a @Kategória annotáció. Az 5. JUnit segítségével a @Kategória a kommentár helyébe a @Címke kommentár:

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

A / használatával bizonyos címkéket felvehetünk / kizárhatunk maven-surefire-plugin:

   maven-surefire-plugin junit5 

3.5. Új kommentárok a futótesztekhez

A @RunWith a tesztkörnyezet más keretrendszerekkel történő integrálására vagy a teljes végrehajtási folyamat megváltoztatására használták a JUnit 4 teszteseteiben.

A JUnit 5 segítségével most már használhatjuk a @ExtendWith jelölés hasonló funkciók biztosítása érdekében.

Például a tavaszi funkciók használatához a JUnit 4-ben:

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

Az 5. JUnit-ben ez egy egyszerű kiterjesztés:

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

3.6. Új tesztszabályok kommentárjai

A JUnit 4-ben a @Szabály és @ClassRule a jelölésekkel speciális funkcionalitást adtak a tesztekhez.

Az 5. JUnit-ben ugyanazt a logikát reprodukálhatjuk a @ExtendWith annotáció.

Tegyük fel például, hogy van egy egyedi szabályunk a JUnit 4-ben, hogy napló nyomokat írjunk egy teszt előtt és után:

public class A TraceUnitTestRule végrehajtja a TestRule {@Orride public Statement sovelletaan (Nyilatkozati alap, Leírás leírása) {return new Statement () {@Override public void assessment () throws Throwable {// Értékelés nyomon követése előtt és után itt ...}}; }}

És egy tesztcsomagban valósítjuk meg:

@Rule public TraceUnitTestRule traceRuleTests = new TraceUnitTestRule (); 

Az 5. JUnit-ben sokkal intuitívabban írhatjuk ugyanezt:

public class TraceUnitExtension implementálja az AfterEachCallback, BeforeEachCallback {@Override public void beforeEach (TestExtensionContext context) dobja a Kivételt {// ...} @Orride public void afterEach (TestExtensionContext context) dobja a Kivételt {// ...}}

A JUnit 5 használata AfterEachCallback és BeforeEachCallback a csomagban elérhető interfészek org.junit.jupiter.api.extension, könnyen alkalmazhatjuk ezt a szabályt a tesztcsomagban:

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

3.7. JUnit 5 Vintage

A JUnit Vintage segíti a JUnit tesztek áttelepítését a JUnit 3 vagy JUnit 4 tesztek futtatásával a JUnit 5 kontextusban.

Használhatjuk a JUnit Vintage Engine importálásával:

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

4. Következtetés

Amint azt ebben a cikkben láthattuk, a JUnit 5 egy moduláris és modern átvétel a JUnit 4 keretrendszerről. Bevezettük a két változat közötti főbb különbségeket, és utaltunk arra, hogyan lehet migrálni egyikről a másikra.

Az oktatóanyag teljes megvalósítása a GitHub oldalon található.