En välskriven testsvit kommer att ha flera tester för en specifik funktion. Genom att gruppera relaterade funktioner kan du uttrycka förhållandet mellan flera grupper av tester. En av de stora fördelarna med att gruppera enhetstestklasser är att det kan minska mängden testkod du skriver, eftersom grupperade tester delar resurser.

JUnit 5 låter dig skapa kapslade tester med @Nested-kommentaren. I den här artikeln kommer du att lära dig vad @Nested-kommentaren är och hur du använder den.

Vad är ett kapslat test?

JUnits @Nested-anteckning signalerar att klassen den associeras med är en inre klass, som är medlem i en annan klass. Ett kapslat test är en testklass som innehåller @Nested-anteckningen, eftersom det betyder att det finns en (eller flera) inre klasser inom en testklass på toppnivå. En kapslad klass kan visas inom en toppnivåklass eller i en klass som också är kapslad.

Skapa Java-klasser att testa

En kapslad testklass ärver alla funktioner i sin överordnade klass. Därför är den bästa tiden att skapa ett kapslat test när det finns en logisk gruppering av testfall eller när ett enskilt testfall har olika funktioner. Ett bra exempel på detta är när du vill testa en klasss förmåga att skapa användbara objekt. Ett annat exempel är när en enskild metod har två eller flera syften.

Här är en exempelklass som du kan använda i en detaljhandelsapplikation, som visar hur du kan skapa ett kapslat test.

offentligklassKund{
skyddadint Kundnummer;
skyddad Sträng kundnamn;
skyddad Sträng kundkod;

// standardkonstruktor
offentligKund(){
detta.customerId = 0;
detta.customerName = "";
detta.customerCode ="";
}

// primär konstruktör
offentligKund(int kund-id, sträng kundnamn, sträng kundkod){
detta.customerId = kund-ID;
detta.customerName = kundnamn;
detta.customerCode = kundkod;
}

// kopieringskonstruktör
offentligKund(Kundkund){
detta.customerId = customer.customerId;
detta.kundnamn = kund.kundnamn;
detta.customerCode = kund.kundkod;
}

// getters och setters
offentligintgetCustomerId(){
lämna tillbaka Kundnummer;
}

offentligtomhetsetCustomerId(int Kundnummer){
detta.customerId = kund-ID;
}

offentlig Sträng getCustomerName(){
lämna tillbaka Köparens namn;
}

offentligtomhetsetCustomerName(Sträng kundnamn){
detta.customerName = kundnamn;
}

offentlig Sträng get CustomerCode(){
lämna tillbaka kundkod;
}

offentligtomhetställ in kundkod(Sträng kundkod){
detta.customerCode = kundkod;
}

// bestäm en kundrabattprocent baserat på kundtyp
offentligdubbelkundtyp(Sträng kundkod){
dubbel rabatt = 0;

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

lämna tillbaka rabatt;
}

// bestäm en kunds totalsumma baserat på kundtyp
offentligdubbelgrandTotal(dubbel total){
dubbel rabatt = kundtyp (kundkod);
dubbel rabattProcent = totalt * rabatt;
dubbel finalTotal = total - rabattPercentage;
lämna tillbaka finalTotal;
}
}

Denna kundklass innehåller alla komponenter i en Java-klass, komplett med två metoder.

Skapa ett kapslat test med JUnit 5

Kundklassen har flera konstruktörer, getters och sättare och två metoder. Du kan skapa en kapslad klass (inom kundtestklassen) som skapar ett nytt kundobjekt och testar alla dess komponenter.

importerastatiskorg.junit.Jupiter.api.Påståenden.*;

importeraorg.junit.Jupiter.api.Visningsnamn;
importeraorg.junit.Jupiter.api.Inkapslade;
importeraorg.junit.Jupiter.api.Testa;

@DisplayName("Kundtestklass som visar hur man SkapaKapslad Tester.")
klassKundtest{
skyddadint kund-ID = 301;
skyddad sträng kundnamn = "Mike Wilson";
skyddad sträng kundkod = "Pre";
skyddaddubbel totalt = 600;

@Nested
@DisplayName("Customer Builder kapslad testklass inom en testklass på toppnivå")
klassCustomerBuilderTest{
Kundkund = ny Kund (kund-ID, kundnamn, kundkod);
dubbel grandTotal = kund.grandTotal (totalt);

@Testa
@DisplayName("Testa kunden's Klasskonstruktörer, getters och sättare och metoder.")
tomhetkundbyggare(){
assertAll(() -> {
assertEquals(Kundnummer, kund.getCustomerId());
assertEquals(Köparens namn, kund.getCustomerName());
assertEquals(kundkod, kund.getCustomerCode());
assertEquals(0.10, kund.kundtyp(kundkod));
assertEquals (540, totalsumma);
});
}
}
}

CustomerTest-klassen är testklassen på högsta nivån till en kapslad CustomerBuilderTest-klass. CustomerBuilderTest skapar ett nytt kundobjekt och testar dess komponenter med hjälp av påstående tester.

Att köra CustomerTest-testklassen ger följande framgångsrika testresultat:

Namnen på testklasserna och testmetoden är beskrivande och heltäckande, tack vare @DisplayName Annotation.

Att veta hur man testar programvara är avgörande

Teknik är en viktig del av vardagen för de flesta. Insatserna för att skapa programvara som gör exakt vad den ska göra har aldrig varit högre.

En självkörande bil som felberäknar sin närhet till ett annat föremål kan orsaka en stor olycka. Därför måste du testa din applikation i varje skede av dess utveckling.