Uvod u JUnitParams

1. Pregled

U ovom ćemo članku istražiti JUnitParams knjižnica i njezini običaji. Jednostavno rečeno, ova knjižnica omogućuje jednostavnu parametrizaciju metoda ispitivanja u JUNIT ispitivanja.

Postoje situacije u kojima se jedina stvar koja se mijenja između više testova jesu parametri. JUNIT sam ima parametarsku podršku, i JUnitParams značajno poboljšava tu funkcionalnost.

2. Ovisnost Mavena

Koristiti JUnitParams u našem projektu, moramo ga dodati našem pom.xml:

 pl.pragmatičari JUnitParams 1.1.0 

Najnoviju verziju knjižnice možete pronaći ovdje.

3. Scenarij testa

Stvorimo klasu koja vrši sigurno zbrajanje dviju cijelih brojeva. Ovo bi se trebalo vratiti Cijeli broj.MAX_VALUE ako se prelije i Cijeli broj.MIN_VALUE ako se podlijeva:

javna klasa SafeAdditionUtil {public int safeAdd (int a, int b) {long result = ((long) a) + b; if (result> Integer.MAX_VALUE) {return Integer.MAX_VALUE; } else if (rezultat <Integer.MIN_VALUE) {return Integer.MIN_VALUE; } return (int) rezultat; }}

4. Konstruiranje jednostavne ispitne metode

Morat ćemo testirati implementaciju metode za različite kombinacije ulaznih vrijednosti kako bismo bili sigurni da implementacija vrijedi za sve moguće scenarije. JUnitParams pruža više od jednog načina za postizanje parametriziranog stvaranja testa.

Pristupimo osnovnom pristupu s minimalnom količinom kodiranja i vidjet ćemo kako se to radi. Nakon toga možemo vidjeti koji su drugi mogući načini implementacije testnih scenarija pomoću JUnitParams:

@RunWith (JUnitParamsRunner.class) javna klasa SafeAdditionUtilTest {private SafeAdditionUtil serviceUnderTest = new SafeAdditionUtil (); @Test @Parameters ({"1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15"}) javna praznina kadaWithAnnotationProvidedParams_thenSafeAdd (int a , int b, int očekivana vrijednost) {assertEquals (očekivana vrijednost, uslugaUnderTest.safeAdd (a, b)); }}

Sada da vidimo kako se ova klasa testa razlikuje od uobičajene JUNIT test klasa.

Prvo što primijetimo je to tamo jerazličiti test trkač u bilješci razreda - JUnitParamsRunner.

Prijelazeći na metodu ispitivanja, vidimo kako je metoda testiranja označena s @Parameters napomena s nizom ulaznih parametara. Označava različite scenarije ispitivanja koji će se koristiti za testiranje naše metode usluge.

Ako test provedemo pomoću Mavena, vidjet ćemo to izvodimo četiri testna slučaja i niti jedan. Izlaz bi bio sličan sljedećem:

-------------------------------------------------- ----- TESTOVI -------------------------------------------- ----------- Pokretanje com.baeldung.junitparams.SafeAdditionUtilTest Testovi: 4, neuspjesi: 0, pogreške: 0, preskočeni: 0, proteklo vrijeme: 0,068 sek - u com.baeldung.junitparams.SafeAdditionUtilTest Rezultati: Izvršeni testovi: 4, neuspjesi: 0, pogreške: 0, preskočeni: 0

5. Različite vrste parametarizacije ispitnih metoda

Pružanje parametara testa izravno u napomeni zasigurno nije najčitaniji način ako imamo puno mogućih scenarija koje treba testirati. JUnitParams nudi niz različitih pristupa koje možemo koristiti za stvaranje parametarskih testova:

  • Izravno u @Parameters napomena (korištena u gornjem primjeru)
  • Korištenje imenovane metode ispitivanja definirane u napomeni
  • Korištenje metode mapirane imenom naziva testne metode
  • Imenovana probna klasa definirana u napomeni
  • Korištenje CSV datoteke

Istražimo pristupe jedan po jedan.

5.1. Izravno u @Parameters Bilješka

Ovaj smo pristup već koristili u primjeru koji smo isprobali. Ono što moramo imati na umu jest da bismo trebali pružiti niz nizova parametara. Unutar niza parametara svaki je parametar odvojen zarezom.

Na primjer, niz bi bio u obliku { “1, 2, 3”, “-10, 30, 20”} a jedan skup parametara predstavljen je kao “1, 2, 3”.

Ograničenje ovog pristupa je da možemo isporučiti samo primitivne i Nizs kao ispitni parametri. Objekte nije moguće predati i kao parametre metode ispitivanja.

5.2. Parametarska metoda

Parametre metode ispitivanja možemo pružiti pomoću druge metode unutar klase. Pogledajmo prvo primjer:

@Test @Parameters (method = "parametersToTestAdd") javna void kadaWithNamedMethod_thenSafeAdd (int a, int b, int očekujeValue) {assertEquals (očekuje seValue, 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}, novi objekt [] {Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; }

Metoda ispitivanja bilježi se u vezi s metodom parametersToAdd (), a parametre dohvaća izvođenjem referencirane metode.

Specifikacija metode pružatelja trebala bi vratiti niz od Objekts kao rezultat. Ako metoda s danim imenom nije dostupna, test slučaj ne uspije s pogreškom:

java.lang.RuntimeException: Nije moguće pronaći metodu: bogusMethodName, tako da nisu upotrijebljeni parametri.

5.3. Metoda preslikana nazivom metode ispitivanja

Ako ništa ne navedemo u @Parameters napomena, JUnitParams pokušava učitati metodu davatelja testnih podataka na temelju naziva testne metode. Naziv metode konstruira se kao “Parametri za” +:

@Test @Parameters javna praznina whenWithnoParam_thenLoadByNameSafeAdd (int a, int b, int očekivana vrijednost) {assertEquals (očekuje seValue, serviceUnderTest.safeAdd (a, b)); } private Object [] parametriForWhenWithnoParam_thenLoadByNameSafe () {return new Object [] {new Object [] {1, 2, 3}, new Object [] {-10, 30, 20}, new Object [] {Integer.MAX_VALUE, 2 , Integer.MAX_VALUE}, novi objekt [] {Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; }

U gornjem primjeru naziv metode ispitivanja je whenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Stoga, kada se izvršava metoda ispitivanja, ona traži metodu davatelja podataka s imenom parametriForWhenWithnoParam_shouldLoadByNameAbdSafeAdd ().

Budući da ta metoda postoji, učitat će podatke iz nje i pokrenuti test. Ako ne postoji takva metoda koja odgovara traženom imenu, test ne uspijeva kao u gornjem primjeru.

5.4. Imenovana probna klasa definirana u napomeni

Slično načinu na koji smo se u prethodnom primjeru pozivali na metodu davatelja podataka, možemo uputiti zasebnu klasu kako bismo pružili podatke za naš test:

@Test @Parameters (source = TestDataProvider.class) javna void kadaWithNamedClass_thenSafeAdd (int a, int b, int očekivana vrijednost) {assertEquals (očekuje seValue, serviceUnderTest.safeAdd (a, b)); } javna klasa TestDataProvider {javni statički objekt [] provideBasicData () {vrati novi objekt [] {novi objekt [] {1, 2, 3}, novi objekt [] {-10, 30, 20}, novi objekt [] { 15, -5, 10}, novi objekt [] {-5, -10, -15}}; } javni statički objekt [] provideEdgeCaseData () {vratiti novi objekt [] {novi objekt [] {Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, novi objekt [] {Integer.MIN_VALUE, -2, Integer.MIN_VALUE},} ; }}

Možemo imati bilo koji broj davatelja testnih podataka u klasi s obzirom na to da naziv metode započinje s "pružati". Ako je tako, izvršitelj odabire te metode i vraća podatke.

Ako nijedna metoda klase ne udovoljava tom zahtjevu, iako te metode vraćaju niz od Objekts, te metode će se zanemariti.

5.5. Korištenje CSV datoteke

Za učitavanje podataka o testiranju možemo koristiti vanjsku CSV datoteku. To pomaže ako je broj mogućih test slučajeva prilično značajan ili ako se test slučajevi često mijenjaju. Promjene se mogu izvršiti bez utjecaja na testni kod.

Recimo da imamo CSV datoteku s parametrima testa kao JunitParamsTestParameters.csv:

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

Pogledajmo sada kako ova se datoteka može koristiti za učitavanje parametara testa u ispitnoj metodi:

@Test @FileParameters ("src / test / resources / JunitParamsTestParameters.csv") javna void kadaWithCsvFile_thenSafeAdd (int a, int b, int očekivana vrijednost) {assertEquals (očekuje seValue, serviceUnderTest.safeAdd (a, b)); }

Jedno ograničenje ovog pristupa je da nije moguće proći složene objekte. Samo primitivci i Nizvrijede.

6. Zaključak

U ovom vodiču pogledali smo kako možemo iskoristiti funkcionalnosti JUnitParams u suštini.

Također smo pokrili različite pristupe koje nam knjižnica omogućuje da parametre ispitivanja dostavimo našim metodama ispitivanja - daleko više od onoga što JUnit sam može učiniti.

Kao i uvijek, izvorni kod možete pronaći na GitHubu.


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