En velskrevet testpakke vil ha flere tester for en bestemt funksjon. Ved å gruppere relaterte funksjoner kan du uttrykke forholdet mellom flere grupper av tester. En av de største fordelene med å gruppere enhetstestklasser er at det kan redusere mengden testkode du skriver, ettersom grupperte tester deler ressurser.

JUnit 5 lar deg lage nestede tester ved å bruke @Nested-kommentaren. I denne artikkelen vil du lære hva @Nested-kommentaren er og hvordan du bruker den.

Hva er en nestet test?

JUnits @Nested-annotering signaliserer at klassen den assosieres med er en indre klasse, som er medlem av en annen klasse. En nestet test er en testklasse som inneholder @Nested-kommentaren, da dette betyr at det er én (eller flere) indre klasse i en testklasse på toppnivå. En nestet klasse kan vises i en klasse på toppnivå, eller i en klasse som også er nestet.

Opprette Java-klasser for å teste

En nestet testklasse arver alle funksjonene til den overordnede klassen. Derfor er den beste tiden å lage en nestet test når det er en logisk gruppering av testtilfeller eller når en enkelt testtilfelle har forskjellige funksjoner. Et godt eksempel på dette er når du vil teste en klasses evne til å lage nyttige objekter. Et annet eksempel er når en enkelt metode har to eller flere formål.

instagram viewer

Her er en eksempelklasse som du kan bruke i en detaljhandelsapplikasjon, som viser hvordan du kan lage en nestet test.

offentligklasseKunde{
beskyttetint Kunde ID;
beskyttet String kundenavn;
beskyttet String kundekode;

// standard konstruktør
offentligKunde(){
dette.customerId = 0;
dette.customerName = "";
dette.customerCode ="";
}

// primær konstruktør
offentligKunde(int kunde-ID, streng kundenavn, streng kundekode){
dette.customerId = kunde-ID;
dette.customerName = kundenavn;
dette.customerCode = kundekode;
}

// kopi konstruktør
offentligKunde(Kundekunde){
dette.customerId = kunde.kundeId;
dette.kundenavn = kunde.kundenavn;
dette.customerCode = kunde.kundekode;
}

// gettere og settere
offentligintget CustomerId(){
komme tilbake Kunde ID;
}

offentligtomromset CustomerId(int Kunde ID){
dette.customerId = kunde-ID;
}

offentlig String getCustomerName(){
komme tilbake Kundenavn;
}

offentligtomromsetCustomerName(streng kundenavn){
dette.customerName = kundenavn;
}

offentlig String få kundekode(){
komme tilbake kundenummer;
}

offentligtomromsett kundekode(streng kundekode){
dette.customerCode = kundekode;
}

// bestemme en kunderabattprosent basert på kundetype
offentligdobbeltKundetype(streng kundekode){
dobbelt rabatt = 0;

hvis (customerCode.toLowerCase().equals("pre")) {
rabatt = 0.10;
} ellershvis (customerCode.toLowerCase().equals("gen")) {
rabatt = 0.02;
} ellershvis (customerCode.toLowerCase().equals("ny")) {
rabatt = 0.05;
}

komme tilbake rabatt;
}

// bestemme en kundes totalsum basert på kundetype
offentligdobbeltgrandTotal(dobbelt Total){
dobbelt rabatt = kundetype (kundekode);
dobbelt rabattProsent = totalt * rabatt;
dobbelt finalTotal = total - rabattProsent;
komme tilbake finalTotal;
}
}

Denne kundeklassen inneholder alle komponentene i en Java-klasse, komplett med to metoder.

Opprette en nestet test med JUnit 5

Kundeklassen har flere konstruktører, gettere og settere, og to metoder. Du kan opprette en nestet klasse (innen kundetestklassen) som oppretter et nytt kundeobjekt og tester alle dets komponenter.

importstatiskorg.junit.jupiter.api.Påstander.*;

importorg.junit.jupiter.api.Visningsnavn;
importorg.junit.jupiter.api. Nestet;
importorg.junit.jupiter.api.Test;

@DisplayName("Kundetestklasse som viser hvordan SkapeNestet Tester.")
klasseKundetest{
beskyttetint kunde-ID = 301;
beskyttet streng kundenavn = "Mike Wilson";
beskyttet streng kundekode = "Pre";
beskyttetdobbelt totalt = 600;

@Nested
@Visningsnavn("Customer Builder Nestet testklasse i en testklasse på toppnivå")
klasseCustomerBuilderTest{
Kunde kunde = ny Kunde (kunde-ID, kundenavn, kundekode);
dobbelt grandTotal = kunde.grandTotal (totalt);

@Test
@Visningsnavn("Tester kunden's Klassekonstruktører, getters og settere, og metoder.")
tomromkundebygger(){
assertAll(() -> {
assertEquals(Kunde ID, kunde.getCustomerId());
assertEquals(Kundenavn, kunde.getCustomerName());
assertEquals(kundenummer, kunde.get CustomerCode());
assertEquals(0.10, kunde.Kundetype(kundenummer));
assertEquals (540, grandTotal);
});
}
}
}

CustomerTest-klassen er testklassen på øverste nivå til en nestet CustomerBuilderTest-klasse. CustomerBuilderTest oppretter et nytt kundeobjekt og tester komponentene ved hjelp av påstandstester.

Utførelse av CustomerTest-testklassen gir følgende vellykkede testresultater:

Navnene på testklassene og testmetoden er beskrivende og omfattende, takket være @DisplayName-kommentar.

Å vite hvordan man tester programvare er avgjørende

Teknologi er en viktig del av hverdagen for de fleste. Innsatsen for å lage programvare som gjør akkurat det den skal gjøre har aldri vært høyere.

En selvkjørende bil som feilberegner sin nærhet til et annet objekt kan forårsake en storulykke. Derfor må du teste applikasjonen din på hvert trinn i utviklingen.