JUnit Eeldatava erandi test: @Test(oodatav)

โšก Nutikas kokkuvรตte

JUnit Eranditestimine kinnitab, et meetod viskab vea, mille see peaks viskama, kasutades @Test annotatsiooni valikulist oodatavat parameetrit JUnit 4 ja meetod assertThrows JUnit 5.

  • ๐Ÿ”˜ Eesmรคrk: Tรตesta, et sobimatu sisend annab dokumenteeritud erandi vaikiva vale vastuse asemel.
  • โ˜‘๏ธ sรผntaksit: @Test(oodatav = ArithmeticException.class) lรคheb lรคbi ainult siis, kui visatakse tรคpselt seda tรผรผpi erand.
  • โœ… Nรคide: JUnitSรตnum jagab nulliga ja AirthematicTest ootab tulemuseks ArithmeticException'i.
  • ๐Ÿงช Alternatiiv: fail()-ile jรคrgnev try-plokk vรตimaldab teil enne pรผรผtud erandi esitamist seda kontrollida.
  • ๐Ÿ› ๏ธ JUnit 5: assertThrows tagastab tabatud erandi, seega saab esitada ka nii teate kui ka pรตhjuse.
  • ๐Ÿ“Œ Lรตks: Oodatav parameeter edastatakse kรตikjal, kus erand esineb, mis vรตib peita tรตrke seadistuskoodis.

JUnit oodatava erandi test parameetri @Test(oodatav) abil

JUnit annab vรตimaluse tracerandi ja ka selleks, et kontrollida, kas kood viskab oodatud erandi vรตi mitte.

JUnit 4 pakub lihtsat ja loetavat viisi erandite testimiseks. Vรตite kasutada jรคrgmist:

  • Valikuline parameeter (eeldatav) @Testi annotatsioonja
  • Et tracTeabe saamiseks saab kasutada funktsiooni โ€žfail()โ€.

Kui testimine erandi korral peate tagama, et erandiklass, mille te selles valikulises parameetris pakute, @Testi annotatsioon on sama, mille meetod tegelikult viskab. Seda seetรตttu, et ootate meetodilt, mida kasutate, erandit. รผksuse testimine; muidu meie JUnit test ebaรตnnestuks.

Nรคide: @Test(oodatav = IllegalArgumentException.class)

Parameetri โ€žoodatavโ€ abil saate mรครคrata erandi nime, mille meie test vรตib visata. รœlaltoodud nรคites kasutate โ€žEbaseaduslik argumendi erandโ€ž, mille test viskab vรคlja, kui arendaja kasutab lubamatut argumenti.

Nรคide funktsiooni @Test(oodatav) kasutamisest

Saame aru erandite testimisest, luues Java klass meetodiga, mis viskab erandSa kรคsitled seda ja paned selle proovitunnis proovile. Mรตtle JUnitMessage.java, millel on meetod matemaatilise tehte sooritamiseks. 14. real olev jagamine jagab nulliga, seega meetod viskab alati vรคlja โ€žArithmeticExceptioniโ€œ. Vaata allpool:

JUnitSรตnumiklass sees Eclipse printMessage jagab nulliga 14. real

package guru99.junit;

public class JUnitMessage{

	private String message;

	public JUnitMessage(String message) {
		this.message = message;
	}

public void printMessage(){

	System.out.println(message); 
	int divide=1/0;

}

public String printHiMessage(){ 

	message="Hi!" + message;
	
	System.out.println(message);

	return message;
}

}

Code Selgitus:

  • Code Rida 7: Parameetritega konstruktori loomine koos vรคlja initsialiseerimisega.
  • Code Rida 11-14: Matemaatilise tehte meetodi loomine.
  • Code Rida 18: Teise meetodi loomine sรตnumi printimiseks.
  • Code Rida 20: Uue stringi loomine sรตnumi printimiseks.
  • Code Rida 22: 20. real loodud uue sรตnumi printimine.

Loome รผlaltoodu jaoks testklassi Java klass erandi kontrollimiseks.

Vaadake allpool olevat testiklassi, mis testib รผlaltoodud kรคsuga visatud erandit (siin ArithmeticException). Java klass:

AirthematicTest.java

Allolev ekraanipilt nรคitab sama testi redaktoris, kus fail on salvestatud nimega AirthematicTest1 ja oodatav parameeter on 13. real esile tรตstetud:

AirthematicTest1 klass Eclipse kus real 13 on esile tรตstetud @Test(eeldatav = ArithmeticException.class)

package guru99.junit;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class AirthematicTest {

	public String message = "Saurabh";
	
	JUnitMessage junitMessage = new JUnitMessage(message);
	
	@Test(expected = ArithmeticException.class)
	public void testJUnitMessage(){

		System.out.println("Junit Message is printing ");
		junitMessage.printMessage();

	}

	@Test
	public void testJUnitHiMessage(){ 
		message="Hi!" + message;
		System.out.println("Junit Message is printing ");
		assertEquals(message, junitMessage.printHiMessage());
	
	}
}

Code Selgitus:

  • Code Rida 13: Kasutame testi loomiseks @Test annotatsiooni. รœlaltoodud klassi meetodi kรคivitamisel kutsub see esile matemaatilise tehte. Siin oodatakse ArithmeticException'i, seega loetlete selle parameetrina @Test'is.
  • Code Rida 17: Funktsiooni printMessage() kรคivitamine JUnitSรตnum.java.
  • Code Rida 21-22: Uue testimismeetodi loomine Hi-teate kontrollimiseks, seekord ilma oodatava parameetrita.

Klassis on kaks testimismeetodit, seega รผhe kรคivitamisega kรคivitatakse mรตlemad: see, mis ootab ArithmeticException'i, ja see, mis esitab tagastatud stringile kinnituse.

Mรคrge: See nรคide liigub algmaterjalis kolme nime all โ€“ loendis nimetatakse klassiks AirthematicTest, redaktori ekraanipildil kuvatakse AirthematicTest1 ja tulemuste vaates kuvatakse JunitTestExample. Kood on kรตigis identne; erineb ainult failinimi.

Teostame selle ja kontrollime tulemust. JUnit vaata allpool olevaid aruandeid jooksva kohta JunitTestExample.java.

Vรคljund:

Siin on vรคljund, mis nรคitab edukat testi ilma tรตrgeteta trace, nagu allpool nรคidatud:

Eclipse JUnit vaata aruandlust Kรคivitub JunitTestExample'i puhul 2/2 ilma vigade ja tรตrgeteta

Mรตlemad meetodid on rohelised. Esimene lรคheb lรคbi, kuna deklareeritud ArithmeticException saabus ja teine โ€‹โ€‹lรคheb lรคbi, kuna tagastatud string sobis kokku. Kui jagamist poleks tehtud, JUnit esimene meetod oleks nurjunud teatega โ€žOodatav erand: java.lang.ArithmeticExceptionโ€.

Kolm viisi erandi testimiseks JUnit 4

Oodatav parameeter on kolmest lรผhim JUnit 4 idioomi, aga see pole alati รตige. Tabel vรตrdleb neid kahe valikut otsustava kรผsimuse osas: kas sa saad sรตnumi kohta vรคita ja kas sa tead, millise rea viskas?

Lรคhenemine Kinnitab sรตnumit? Paneb viskejoone paika? Parim on
@Test(eeldatav = X.klass) Ei Ei โ€” meetodi iga rida vรตib visata Lรผhikesed testid, kus oluline on ainult erandi tรผรผp.
proovi / ebaรตnnestu() / pรผรผa kinni Jah, pรผรผdeploki sees Jah โ€” jรคlgitakse ainult valvega kรตnet Testid, mis peavad kontrollima sรตnumit vรตi selle pรตhjust.
@Rule ExpectedException Jah, lรคbi expectMessage() funktsiooni Ei Pรคrandversioonid on juba reeglitele รผles ehitatud.

Sissejuhatuses mainitud fail() idioom nรคeb vรคlja selline. Kui kutse ei anna tulemust, siis fail() kรคivitub ja test annab sinu kirjutatud teate:

@Test
public void testDivideByZero() {
    try {
        junitMessage.printMessage();
        fail("Expected an ArithmeticException");
    } catch (ArithmeticException e) {
        assertEquals("/ by zero", e.getMessage());
    }
}

ExpectedException reegel asub nende kahe vahel. See aegus aastal JUnit 4.13 jรคrgmisena kirjeldatud assertThrows meetodi kasuks, seega uus JUnit 4 testi ei tohiks seda omaks vรตtta.

Kuidas testida erandeid JUnit 5 funktsiooniga assertThrows()

JUnit 5 eemaldab @Testist oodatava parameetri tรคielikult. Jupiter varustab assertThrows(), mis vรตtab erandiklassi ja testitavat koodi sisaldava lambda. See tagastab pรผรผtud erandi, seega saab sรตnumi, pรตhjuse ja mis tahes kohandatud vรคlja hiljem esitada.

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;

public class AirthematicJupiterTest {

    JUnitMessage junitMessage = new JUnitMessage("Saurabh");

    @Test
    public void testJUnitMessage() {
        ArithmeticException thrown = assertThrows(
                ArithmeticException.class,
                () -> junitMessage.printMessage());
        assertEquals("/ by zero", thrown.getMessage());
    }
}

Kolm omavahel seotud vรคiteid tรคiendada perekonda:

  • assertThrows aktsepteerib erandi tรผรผpi vรตi selle mis tahes alamklassi.
  • assertThrowsExactly lรผkkab alamklassi tagasi, seega lรคbib ainult nimetatud tรผรผp.
  • assertDoesNotThrow esitab vastupidise ootuse, et plokk lรตpeb puhtalt.

. JUnit Sellel lehel olev 4 kood tรถรถtab endiselt JUnit Platvorm lรคbi vana mootori, seega ei pea projekti migreerimise ajal tรถรถtamiseks midagi รผlaltoodut รผmber kirjutama.

Levinud vead erandite testimisel JUnit

Erandtestid ebaรตnnestuvad vรคhestel รคratuntavatel viisidel. Igas reas on nimetatud sรผmptom, pรตhjus ja lahendus.

Sรผmptom Pรตhjus Mรครคrama
Oodatav erand: java.lang.ArithmeticException Meetod viidi lรตpule ilma viskamiseta. Kontrollige, kas sisend on tรตesti vigane, seejรคrel kรคivitage uuesti.
Test lรคbis, aga vale joon viskas Oodatav parameeter jรคlgib kogu meetodit, sealhulgas seadistamist. Liiguta seadistus vรคlja vรตi lรผlitu รผhe kutse jooksul assertThrows'ile.
Redaktoris olev tรถรถtlemata erandi tรผรผp Visatakse kontrollitud erand, aga seda ei deklareerita kunagi. Lisa testimismeetodi signatuurile visked.
Test lรคbis alamklassi, mida sa ei kavatsenud assertThrows aktsepteerib nimetatud tรผรผbi alamklasse. Range tรผรผbivaste saamiseks kasutage assertThrowsExactly .
oodatud atribuut ei ole kehtiv Test kompileeriti Jupiteri @Test annotatsiooni suhtes. Impordi org.junit.Test faili jaoks JUnit 4 vรตi liigu assertThrows'i (vรตi assertViskete) sooritamiseks.

Viimane rida on see, mis tabab enamiku inimesi migratsiooni keskel, sest mรตlemad annotatsioonid kannavad nime @Test ja ainult import eristab neid. Keeping รผks JUnit versioon testjuhtum Klass vรคldib tervet probleemide klassi.

KKK

Oodatud parameeter ei saa sรตnumit kontrollida. Mรคhi kutse try-plokki, kutsu kohe pรคrast seda vรคlja fail() ja rakenda getMessage() funktsiooni catch-ploki sees. JUnit 5 teeb selle lihtsamaks, sest assertThrows tagastab pรผรผtud erandi.

JUnit ebaรตnnestub testis ja annab teada โ€žOodatav erandโ€, millele jรคrgneb teie nimetatud klass. Midagi muud ei teatata, seega test, mis kunagi ei viska erandit, nรคeb vรคlja identne sellega, mille tootmiskood muutis kรคitumist vaikselt.

Tehisintellekti assistendid loevad meetodit, loetlevad sisendid, mis jรตuavad iga viskekรคsuni, ja koostavad iga haru kohta testi. Vรคljundit kรคsitletakse lรคhtepunktina: assistent jรคreldab koodist erandi tรผรผbi, nii et vale viskekรคsk kopeeritakse testi tรคpselt.

Copilot jรคrgib failis juba olemasolevat stiili, seega segaprojekt saab segatud stiili. Enne soovituse vastuvรตtmist kontrollige impordirida, sest org.junit.Test ja org.junit.jupiter.api.Test nรคevad redaktoris identsed vรคlja.

See on endiselt olemas, kuid see aegus aastal JUnit 4.13 ja seda pole kunagi Jupiterile portitud. Olemasolevad testid vรตivad selle alles hoida; uued testid peaksid kasutama assertThrows funktsiooni, mis loeb paremini ja ei vaja avalikku reeglivรคlja.

Jah. Parameeter lambda on kรคivitatav fail, mis deklareeritakse viskama (throwable), seega kontrollitud erand ei vaja testimismeetodil endal throws-klauslit. Sama kehtib ka JUnit 4 proovige idioomi tabada.

Funktsioon assertThrows aktsepteerib mis tahes nimetatud tรผรผbi alamklassi, seega eeldades RuntimeException'i, antakse edasi ka NullPointerException. Kasutage assertThrowsExactly'd, kui tรคpne klass on oluline, vรตi nimetage kรตige kitsam tรผรผp, mida te tegelikult ootate.

Ainult juhul, kui erand on osa pettusesttract. Erandi testimisel ei luba meetod kunagi juhusliku kรคitumise korral lukke tekitada ja muudab refaktoreerimise raskemaks, mis kaotab testi mรตtte.

Vรตta see postitus kokku jรคrgmiselt: