Úvod do JUnitParams

1. Prehľad

V tomto článku preskúmame JUnitParams knižnica a jej použitie. Jednoducho povedané, táto knižnica poskytuje ľahkú parametrizáciu testovacích metód v systéme Windows JUnit testy.

Existujú situácie, kedy sa medzi viacerými testami menia iba parametre. JUnit sám má podporu parametrizácie a JUnitParams výrazne zlepšuje túto funkcionalitu.

2. Závislosť od Maven

Použit JUnitParams v našom projekte ho musíme pridať do nášho pom.xml:

 pl.pragmatists JUnitParams 1.1.0 

Najnovšiu verziu knižnice nájdete tu.

3. Testovací scenár

Vytvorme triedu, ktorá umožňuje bezpečné pridanie dvoch celých čísel. Toto by sa malo vrátiť Celé číslo.MAX_VALUE ak pretečie a Celé číslo. MIN_VALUE ak pretečie:

public class SafeAdditionUtil {public int safeAdd (int a, int b) {long result = ((long) a) + b; if (výsledok> Integer.MAX_VALUE) {návrat Integer.MAX_VALUE; } else if (výsledok <Integer.MIN_VALUE) {návrat Integer.MIN_VALUE; } návrat (int) výsledok; }}

4. Vytvorenie jednoduchej testovacej metódy

Budeme musieť vyskúšať implementáciu metódy pre rôzne kombinácie vstupných hodnôt, aby sme sa ubezpečili, že implementácia platí pre všetky možné scenáre. JUnitParams poskytuje viac ako jeden spôsob, ako dosiahnuť vytvorenie parametrizovaného testu.

Zoberme si základný prístup s minimálnym počtom kódovania a pozrime sa, ako sa to robí. Potom uvidíme, aké sú ďalšie možné spôsoby implementácie testovacích scenárov pomocou JUnitParams:

@RunWith (JUnitParamsRunner.class) verejná trieda SafeAdditionUtilTest {private SafeAdditionUtil serviceUnderTest = nový SafeAdditionUtil (); @Test @Parameters ({"1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15"}) verejná neplatnosť whenWithAnnotationProvidedParams_thenSafeAdd (int a , int b, int expectValue) {assertEquals (expectValue, serviceUnderTest.safeAdd (a, b)); }}

Teraz sa pozrime, ako sa táto testovacia trieda líši od bežnej JUnit testovacia trieda.

Prvá vec, ktorú si všimneme, je to existujeiný testovací bežec v anotácii triedy - JUnitParamsRunner.

Ak prejdeme k testovacej metóde, zistíme, že táto testovacia metóda je anotovaná @Parametre anotácia s poľom vstupných parametrov. Označuje rôzne testovacie scenáre, ktoré sa použijú na testovanie našej metódy poskytovania služieb.

Ak spustíme test pomocou Mavenu, uvidíme to prevádzkujeme štyri testovacie prípady, ani jeden. Výstup by bol podobný tomuto:

-------------------------------------------------- ----- TESTY -------------------------------------------- ----------- Spustenie com.baeldung.junitparams.SafeAdditionUtilTest Testy spustené: 4, zlyhania: 0, chyby: 0, vynechané: 0, uplynulý čas: 0,068 s - v com.baeldung.junitparams.SafeAdditionUtilTest Výsledky: Spustené testy: 4, Zlyhania: 0, Chyby: 0, Vynechané: 0

5. Rôzne typy parametrizácie testovacích metód

Poskytovanie testovacích parametrov priamo v anotácii určite nie je najčitateľnejším spôsobom, ak máme veľa možných scenárov, ktoré je potrebné testovať. JUnitParams ponúka súbor rôznych prístupov, ktoré môžeme použiť na vytvorenie parametrizovaných testov:

  • Priamo v @Parametre anotácia (použitá v príklade vyššie)
  • Použitie pomenovanej testovacej metódy definovanej v anotácii
  • Použitie metódy mapovanej názvom testovacej metódy
  • Pomenovaná testovacia trieda definovaná v anotácii
  • Pomocou súboru CSV

Poďme preskúmať prístupy jeden po druhom.

5.1. Priamo v @Parametre Anotácia

Tento prístup sme už použili v príklade, ktorý sme vyskúšali. Musíme si uvedomiť, že by sme mali poskytovať rad reťazcov parametrov. V rámci reťazca parametrov je každý parameter oddelený čiarkou.

Napríklad pole by malo byť vo forme { “1, 2, 3”, “-10, 30, 20”} a jedna sada parametrov je reprezentovaná ako “1, 2, 3”.

Obmedzenie tohto prístupu je, že môžeme dodávať iba primitívne a Strings ako testovacie parametre. Nie je tiež možné zadať objekty ako parametre testovacej metódy.

5.2. Metóda parametrov

Parametre testovacej metódy môžeme poskytnúť pomocou inej metódy v rámci triedy. Pozrime sa najskôr na príklad:

@Test @Parameters (method = "parametersToTestAdd") public void whenWithNamedMethod_thenSafeAdd (int a, int b, int expectValue) {assertEquals (expectValue, serviceUnderTest.safeAdd (a, b)); } private Object [] parametersToTestAdd () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] {Integer.MAX_VALUE, 2 , Integer.MAX_VALUE}, nový objekt [] {Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; }

Skúšobná metóda je pre túto metódu anotovaná parametersToAdd (), a načíta parametre spustením referenčnej metódy.

Špecifikácia metódy poskytovateľa by mala vrátiť pole Objekts vo výsledku. Ak metóda s daným názvom nie je k dispozícii, testovací prípad zlyhá s chybou:

java.lang.RuntimeException: Nepodarilo sa nájsť metódu: bogusMethodName, takže sa nepoužili žiadne parametre.

5.3. Metóda mapovaná podľa názvu testovacej metódy

Pokiaľ neurčíme nič v @Parametre anotácia, JUnitParams sa pokúsi načítať metódu poskytovateľa testovacích údajov na základe názvu testovacej metódy. Názov metódy je konštruovaný ako „ParametersFor“ +:

@Test @Parameters public void whenWithnoParam_thenLoadByNameSafeAdd (int a, int b, int expectValue) {assertEquals (expectValue, serviceUnderTest.safeAdd (a, b)); } private Object [] parametersForWhenWithnoParam_thenLoadByNameSafe () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] {Integer.MAX_VALUE, 2 , Integer.MAX_VALUE}, nový objekt [] {Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; }

Vo vyššie uvedenom príklade je názov testovacej metódy whenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Preto pri vykonávaní testovacej metódy hľadá metódu poskytovateľa údajov s názvom parametre ForWhenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Pretože táto metóda existuje, načíta z nej údaje a vykoná test. Ak neexistuje žiadna takáto metóda zodpovedajúca požadovanému názvu, test zlyhá ako vo vyššie uvedenom príklade.

5.4. Pomenovaná testovacia trieda definovaná v anotácii

Podobným spôsobom, ako sme v predchádzajúcom príklade odkazovali na metódu poskytovateľa údajov, môžeme odkázať na samostatnú triedu, ktorá poskytne údaje pre náš test:

@Test @Parameters (source = TestDataProvider.class) public void whenWithNamedClass_thenSafeAdd (int a, int b, int expectValue) {assertEquals (expectValue, serviceUnderTest.safeAdd (a, b)); } verejná trieda TestDataProvider {verejný statický objekt [] provideBasicData () {vrátiť nový objekt [] {nový objekt [] {1, 2, 3}, nový objekt [] {-10, 30, 20}, nový objekt [] { 15, -5, 10}, nový objekt [] {-5, -10, -15}}; } verejný statický objekt [] provideEdgeCaseData () {návrat nový objekt [] {nový objekt [] {Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, nový objekt [] {Integer.MIN_VALUE, -2, Integer.MIN_VALUE},} ; }}

V triede môžeme mať ľubovoľný počet poskytovateľov údajov o testoch, pretože názov metódy začína výrazom „provide“. Ak je to tak, exekútor tieto metódy vyberie a vráti údaje.

Ak túto požiadavku nespĺňajú žiadne metódy triedy, aj keď tieto metódy vracajú pole Objekts, tieto metódy budú ignorované.

5.5. Používanie súboru CSV

Na načítanie údajov z testu môžeme použiť externý súbor CSV. To pomáha, ak je počet možných testovacích prípadov dosť vysoký alebo ak sa testovacie prípady často menia. Zmeny je možné vykonať bez ovplyvnenia testovacieho kódu.

Povedzme, že máme súbor CSV s testovacími parametrami ako JunitParamsTestParameters.csv:

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

Teraz sa pozrime ako tento súbor je možné použiť na načítanie parametrov testu v testovacej metóde:

@Test @FileParameters ("src / test / resources / JunitParamsTestParameters.csv") public void whenWithCsvFile_thenSafeAdd (int a, int b, int expectValue) {assertEquals (expectValue, serviceUnderTest.safeAdd (a, b) }

Jedným z obmedzení tohto prístupu je, že nie je možné prejsť zložitými objektmi. Iba primitívi a Strings sú platné.

6. Záver

V tomto tutoriáli sme sa pozreli na to, ako môžeme využiť funkcie JUnitParams stručne.

Pokryli sme tiež rôzne prístupy, ktoré nám knižnica poskytuje pri dodávaní testovacích parametrov našim testovacím metódam - teda nad rámec toho, čo dokáže samotný JUnit.

Ako vždy, zdrojový kód nájdete na GitHub.


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