A JUnitParams bemutatása

1. Áttekintés

Ebben a cikkben a JUnitParams könyvtár és felhasználásai. Egyszerűen fogalmazva, ez a könyvtár egyszerű paraméterezést biztosít a tesztelési módszerek számára JUnit tesztek.

Vannak olyan helyzetek, amikor a tesztek között csak a paraméterek változnak. JUnit maga rendelkezik paraméterezési támogatással, és JUnitParams jelentősen javítja ezt a funkcionalitást.

2. Maven-függőség

Használni JUnitParams projektünkben hozzá kell adnunk a sajátunkhoz pom.xml:

 pl.pragmatikusok JUnitParams 1.1.0 

A könyvtár legújabb verziója itt található.

3. Teszt forgatókönyv

Hozzunk létre egy osztályt, amely két egész szám biztonságos hozzáadását végzi. Ennek vissza kellene térnie Egész.MAX_VALUE ha túlcsordul, és Egész szám.MIN_VALUE ha elárasztja:

public class SafeAdditionUtil {public int safeAdd (int a, int b) {hosszú eredmény = ((hosszú) a) + b; if (eredmény> Egész szám.MAX_VALUE) {visszatér Integer.MAX_VALUE; } else if (eredmény <Integer.MIN_VALUE) {return Integer.MIN_VALUE; } return (int) eredmény; }}

4. Egyszerű vizsgálati módszer elkészítése

Meg kell vizsgálnunk a módszer megvalósítását a bemeneti értékek különböző kombinációi számára, hogy megbizonyosodhassunk arról, hogy a megvalósítás minden lehetséges forgatókönyvre igaz. JUnitParams több lehetőséget nyújt a paraméterezett teszt létrehozásának elérésére.

Vegyük az alap megközelítést minimális mennyiségű kódolással, és nézzük meg, hogyan történik. Ezt követően láthatjuk, hogy a teszt forgatókönyvek miként valósíthatók meg a JUnitParams segítségével:

@RunWith (JUnitParamsRunner.class) nyilvános osztály SafeAdditionUtilTest {private SafeAdditionUtil serviceUnderTest = new SafeAdditionUtil (); @Test @Parameters ({"1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15"}) public void whenWithAnnotationProvidedParams_thenSafeAdd (int a , int b, int vártérték) {assertEquals (várható érték, serviceUnderTest.safeAdd (a, b)); }}

Most nézzük meg, hogy különbözik ez a tesztosztály a szokásosaktól JUnit teszt osztály.

Az első dolog, amit észreveszünk, az az van egykülönböző tesztfutó az osztály annotációjában - JUnitParamsRunner.

Továbblépve a vizsgálati módszerre, azt látjuk, hogy a vizsgálati módszerrel meg van jegyezve @Paraméterek annotáció egy bemeneti paraméter tömbjével. Különböző tesztelési forgatókönyveket jelöl meg, amelyeket a szolgáltatási módszerünk tesztelésére használunk.

Ha a tesztet Maven segítségével futtatjuk, akkor meglátjuk négy tesztesetet futtatunk, és egyet sem. A kimenet hasonló lenne a következőkhöz:

-------------------------------------------------- ----- VIZSGÁLATOK -------------------------------------------- ----------- com.baeldung.junitparams.SafeAdditionUtilTest futtatása: Futtatott tesztek: 4, hibák: 0, hibák: 0, kihagyva: 0, eltelt idő: 0,068 mp - com.baeldung.junitparams.SafeAdditionUtilTest Eredmények: Futtatott tesztek: 4, hibák: 0, hibák: 0, kihagyott: 0

5. A vizsgálati módszerek paraméterezésének különféle típusai

A tesztparaméterek közvetlen megadása az annotációban nem biztos, hogy a legolvasottabb módszer, ha rengeteg lehetséges forgatókönyvünk van, amelyeket tesztelni kell. JUnitParams különböző megközelítéseket kínál, amelyeket felhasználhatunk a paraméterezett tesztek létrehozásához:

  • Közvetlenül a @Paraméterek kommentár (a fenti példában használatos)
  • Az annotációban meghatározott megnevezett vizsgálati módszer használata
  • A vizsgálati módszer neve szerint leképezett módszer használata
  • Egy megnevezett tesztosztály, amelyet az annotációban definiáltak
  • CSV fájl használata

Fedezzük fel egyenként a megközelítéseket.

5.1. Közvetlenül a @Paraméterek Megjegyzés

Ezt a megközelítést már használtuk a kipróbált példában. Amit szem előtt kell tartanunk, hogy meg kell adnunk egy tömb paraméterláncot. A paraméterláncban minden paramétert vessző választ el.

Például a tömb a { “1, 2, 3”, “-10, 30, 20”} és az egyik paraméterkészlet a következőképpen van ábrázolva “1, 2, 3”.

Ennek a megközelítésnek a korlátja az, hogy csak primitíveket és Húrs mint tesztparaméter. Nem lehet objektumokat beküldeni vizsgálati módszer paramétereként is.

5.2. Paraméteres módszer

A vizsgálati módszer paramétereit az osztályon belül egy másik módszerrel tudjuk megadni. Lássunk először egy példát:

@Test @Parameters (method = "parametersToTestAdd") public void whenWithNamedMethod_thenSafeAdd (int a, int b, int várható érték) {assertEquals (várható érték, serviceUnderTest.safeAdd (a, b)); } private Object [] paraméterekToTestAdd () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] {Integer.MAX_VALUE, 2 Egész szám.MAX_VALUE}, új objektum [] {egész szám.MIN_VALUE, -8, egész szám.MIN_VALUE}}; }

A vizsgálati módszer a módszerrel kapcsolatban megjegyzéssel van ellátva parametriToAdd (), és a hivatkozott módszer futtatásával lekéri a paramétereket.

A szolgáltató metódusának meg kell adnia egy tömböt Tárgys ennek eredményeként. Ha a megadott névvel rendelkező módszer nem áll rendelkezésre, a teszteset meghiúsul a hibával:

java.lang.RuntimeException: A metódus: bogusMethodName nem található, ezért nem használtak paramétereket.

5.3. A módszer a vizsgálati módszer nevével van leképezve

Ha nem adunk meg semmit a @Paraméterek kommentár, JUnitParams megpróbál betölteni egy tesztadat-szolgáltató módszert a teszt módszer neve alapján. A metódus neve úgy van felépítve „ParametersFor” +:

@Test @Parameters public void whenWithnoParam_thenLoadByNameSafeAdd (int a, int b, int várható érték) {assertEquals (várható érték, serviceUnderTest.safeAdd (a, b)); } private Object [] paraméterekForWhenWithnoParam_thenLoadByNameSafe () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] {Integer.MAX_VALUE, 2 Egész szám.MAX_VALUE}, új objektum [] {egész szám.MIN_VALUE, -8, egész szám.MIN_VALUE}}; }

A fenti példában a vizsgálati módszer neve whenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Ezért a tesztmódszer végrehajtásakor egy adatszolgáltatói módszert keres a névvel paraméterekForWhenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Mivel ez a módszer létezik, adatokat tölt be belőle, és lefuttatja a tesztet. Ha nincs ilyen módszer, amely megfelel a szükséges névnek, a teszt sikertelen lesz mint a fenti példában.

5.4. A jelölésen belül definiált tesztosztály

Hasonlóan ahhoz, ahogyan az előző példában egy adatszolgáltatói módszerre utaltunk, külön osztályra is hivatkozhatunk, hogy megadjuk az adatokat a tesztünkhöz:

@Test @Parameters (forrás = TestDataProvider.class) public void whenWithNamedClass_thenSafeAdd (int a, int b, int várható érték) {assertEquals (várható érték, serviceUnderTest.safeAdd (a, b)); } public class TestDataProvider {public static Object [] provideBasicData () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] { 15, -5, 10}, új objektum [] {-5, -10, -15}}; } public static Object [] provideEdgeCaseData () {return new Object [] {new Object [] {Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object [] {Integer.MIN_VALUE, -2, Integer.MIN_VALUE},} ; }}

Bármilyen tesztadat-szolgáltatóval rendelkezhetünk egy osztályban, feltéve, hogy a metódus neve „előadással” kezdődik. Ha igen, a végrehajtó kiválasztja ezeket a módszereket, és visszaadja az adatokat.

Ha egyetlen osztály metódus sem felel meg ennek a követelménynek, annak ellenére, hogy ezek a módszerek egy tömböt adnak vissza Tárgys ezeket a módszereket figyelmen kívül hagyják.

5.5. CSV fájl használata

Külső CSV fájlt használhatunk a tesztadatok betöltésére. Ez segít, ha a lehetséges tesztesetek száma meglehetősen jelentős, vagy ha a teszteseteket gyakran megváltoztatják. A változtatások a tesztkód befolyásolása nélkül is elvégezhetők.

Tegyük fel, hogy van egy CSV fájlunk, amely tesztparaméterekkel rendelkezik JunitParamsTestParameters.csv:

1,2,3 -10, 30, 20 15, -5, 10 -5, -10, -15

Most nézzük meg, hogyan ez a fájl felhasználható a tesztparaméterek betöltésére a vizsgálati módszerben:

@Test @FileParameters ("src / test / resources / JunitParamsTestParameters.csv") public void whenWithCsvFile_thenSafeAdd (int a, int b, int várható érték) {assertEquals (várható érték, serviceUnderTest.safeAdd (a, b)); }

Ennek a megközelítésnek az egyik korlátja, hogy nem lehet komplex objektumokat átadni. Csak primitívek és Húrs érvényesek.

6. Következtetés

Ebben az oktatóanyagban megvizsgáltuk, hogyan tudjuk kihasználni a JUnitParams dióhéjban.

Különféle megközelítésekre is kitértünk, amelyeket a könyvtár biztosít számunkra, hogy vizsgálati paramétereket szolgáltassunk vizsgálati módszereinkhez - jóval túl azon, amit maga a JUnit képes megtenni.

Mint mindig, a forráskód megtalálható a GitHubon.