Een goed geschreven testsuite heeft verschillende tests voor een specifieke functie. Door verwante kenmerken te groeperen, kunt u de relatie tussen verschillende groepen tests uitdrukken. Een van de belangrijkste voordelen van het groeperen van unit-testklassen is dat het de hoeveelheid testcode die u schrijft kan verminderen, aangezien gegroepeerde tests bronnen delen.

Met JUnit 5 kunt u geneste tests maken met behulp van de @Nested-annotatie. In dit artikel leert u wat de @Nested-annotatie is en hoe u deze kunt gebruiken.

Wat is een geneste test?

De @Nested-annotatie van JUnit geeft aan dat de klasse waarmee het associeert een innerlijke klasse is, die lid is van een andere klasse. Een geneste test is een testklasse die de annotatie @Nested bevat, aangezien dit betekent dat er een (of meer) interne klasse is binnen een testklasse op het hoogste niveau. Een geneste klasse kan voorkomen binnen een klasse op het hoogste niveau, of binnen een klasse die ook is genest.

Java-klassen maken om te testen

instagram viewer

Een geneste testklasse erft alle kenmerken van de bovenliggende klasse. Daarom is het beste moment om een ​​geneste test te maken wanneer er een logische groepering van testgevallen is of wanneer een enkele testcase verschillende kenmerken heeft. Een goed voorbeeld hiervan is wanneer u het vermogen van een klasse om bruikbare objecten te maken wilt testen. Een ander voorbeeld is wanneer een enkele methode twee of meer doelen heeft.

Hier is een voorbeeldklasse die u zou kunnen gebruiken in een retailtoepassing, die laat zien hoe u een geneste test kunt maken.

openbaarklasKlant{
beschermdint Klanten ID;
beschermd Tekenreeks klantnaam;
beschermd String klantCode;

// standaard constructeur
openbaarKlant(){
dit.klantId = 0;
dit.klantnaam = "";
dit.klantCode ="";
}

// primaire constructeur
openbaarKlant(int klantID, tekenreeks klantnaam, tekenreeks klantcode){
dit.customerId = klantId;
dit.customerName = klantnaam;
dit.klantCode = klantCode;
}

// constructeur kopiëren
openbaarKlant(Klant klant){
dit.customerId = klant.customerId;
dit.customerName = klant.customerName;
dit.customerCode = klant.customerCode;
}

// getters en setters
openbaarintgetCustomerId(){
opbrengst Klanten ID;
}

openbaarleegtesetKlantID(int Klanten ID){
dit.customerId = klantId;
}

openbaar Snaar getKlantNaam(){
opbrengst klantnaam;
}

openbaarleegtesetKlantNaam(Tekenreeks klantnaam){
dit.customerName = klantnaam;
}

openbaar Snaar getKlantCode(){
opbrengst klantencode;
}

openbaarleegtesetKlantCode(Tekenreeks klantCode){
dit.klantCode = klantCode;
}

// bepaal een klantkortingspercentage op basis van klanttype
openbaardubbeleklant type(Tekenreeks klantCode){
dubbele korting = 0;

als (customerCode.toLowerCase().equals("pre")) {
korting = 0.10;
} andersals (customerCode.toLowerCase().equals("gen")) {
korting = 0.02;
} andersals (customerCode.toLowerCase().equals("nieuw")) {
korting = 0.05;
}

opbrengst korting;
}

// bepaal het totaaltotaal van een klant op basis van klanttype
openbaardubbeleeindtotaal(dubbele totaal){
dubbele korting = klantType (klantCode);
dubbele kortingspercentage = totaal * korting;
dubbele finalTotal = totaal - kortingspercentage;
opbrengst definitiefTotaal;
}
}

Deze Customer-klasse bevat alle componenten van een Java-klasse, compleet met twee methoden.

Een geneste test maken met JUnit 5

De klasse Customer heeft verschillende constructors, getters en setters, en twee methoden. U kunt een geneste klasse maken (binnen de testklasse Klant) die een nieuw klantobject maakt en alle componenten ervan test.

importerenstatischorg.junit.Jupiter.api.Beweringen.*;

importerenorg.junit.Jupiter.api.Weergavenaam;
importerenorg.junit.Jupiter.api.Genest;
importerenorg.junit.Jupiter.api.Test;

@DisplayName("Testklasse klant laat zien hoe CreërenGenest testen.")
klasKlantTest{
beschermdint klantID = 301;
beschermde string klantnaam = "mike wilson";
beschermd String klantCode = "Pre";
beschermddubbele totaal = 600;

@Genest
@Weergavenaam("Customer Builder Geneste testklasse binnen een testklasse op het hoogste niveau")
klasCustomerBuilderTest{
Klant klant = nieuw Klant (customerId, customerName, customerCode);
dubbele grandTotal = klant.grandTotal (totaal);

@Test
@Weergavenaam("De klant testen's Class Constructors, Getters en Setters, en Methoden.")
leegteklantBuilder(){
assertAll(() -> {
assertEquals(Klanten ID, klant.getCustomerId());
assertEquals(klantnaam, klant.getKlantNaam());
assertEquals(klantencode, klant.getKlantCode());
assertEquals(0.10, klant.klant type(klantencode));
assertEquals (540, grandTotal);
});
}
}
}

De klasse CustomerTest is de testklasse op het hoogste niveau voor een geneste klasse CustomerBuilderTest. CustomerBuilderTest maakt een nieuw klantobject en test de componenten ervan met behulp van bewering testen.

Het uitvoeren van de testklasse CustomerTest levert de volgende succesvolle testresultaten op:

De namen van de testklassen en de testmethode zijn beschrijvend en volledig, dankzij de @DisplayName-annotatie.

Weten hoe je software moet testen is cruciaal

Technologie is voor de meeste mensen een belangrijk aspect van het dagelijks leven. De inzet voor het maken van software die precies doet wat het moet doen, is nog nooit zo hoog geweest.

Een zelfrijdende auto die de nabijheid van een ander object verkeerd inschat, kan een zwaar ongeval veroorzaken. Daarom moet u uw applicatie in elke ontwikkelingsfase testen.