Dobře napsaná sada testů bude mít několik testů pro konkrétní funkci. Seskupením souvisejících funkcí můžete vyjádřit vztah mezi několika skupinami testů. Jednou z hlavních výhod seskupování tříd unit testů je to, že může snížit množství testovacího kódu, který napíšete, protože seskupené testy sdílejí zdroje.
JUnit 5 vám umožňuje vytvářet vnořené testy pomocí anotace @Nested. V tomto článku se dozvíte, co je anotace @Nested a jak ji používat.
Co je vnořený test?
Anotace @Nested JUnit signalizuje, že třída, ke které se přidružuje, je vnitřní třída, která je členem jiné třídy. Vnořený test je testovací třída, která obsahuje anotaci @Nested, protože to znamená, že v rámci testovací třídy nejvyšší úrovně existuje jedna (nebo více) vnitřní třída. Vnořená třída se může objevit v rámci třídy nejvyšší úrovně nebo v rámci třídy, která je také vnořená.
Vytváření tříd Java k testování
Vnořená testovací třída zdědí všechny funkce své nadřazené třídy. Proto je nejlepší čas na vytvoření vnořeného testu, když existuje logické seskupení testovacích případů nebo když jeden testovací případ má různé vlastnosti. Dobrým příkladem toho je, když chcete otestovat schopnost třídy vytvářet užitečné objekty. Dalším příkladem je situace, kdy jedna metoda má dva nebo více účelů.
Zde je příklad třídy, kterou můžete použít v maloobchodní aplikaci a která ukazuje, jak můžete vytvořit vnořený test.
veřejnosttřídaZákazník{
chráněnýint zákaznické identifikační číslo;
chráněný Řetězec customerName;
chráněný Řetězec customerCode;// výchozí konstruktor
veřejnostZákazník(){
tento.customerId = 0;
tento.customerName = "";
tento.customerCode ="";
}// primární konstruktor
veřejnostZákazník(int customerId, String customerName, String customerCode){
tento.customerId = customerId;
tento.customerName = customerName;
tento.customerCode = customerCode;
}// kopírování konstruktoru
veřejnostZákazník(Zákazník zákazník){
tento.customerId = customer.customerId;
tento.customerName = customer.customerName;
tento.customerCode = customer.customerCode;
}// getters a setters
veřejnostintgetCustomerId(){
vrátit se zákaznické identifikační číslo;
}veřejnostprázdnotasetCustomerId(int zákaznické identifikační číslo){
tento.customerId = customerId;
}veřejnost Tětiva getCustomerName(){
vrátit se Jméno zákazníka;
}veřejnostprázdnotasetCustomerName(řetězec customerName){
tento.customerName = customerName;
}veřejnost Tětiva getCustomerCode(){
vrátit se zákaznický kód;
}veřejnostprázdnotasetCustomerCode(řetězec customerCode){
tento.customerCode = customerCode;
}// určit procento zákaznické slevy na základě typu zákazníka
veřejnostdvojnásobekcustomerType(řetězec customerCode){
dvojnásobek sleva = 0;-li (customerCode.toLowerCase().equals("pre")) {
sleva = 0.10;
} jiný-li (customerCode.toLowerCase().equals("gen")) {
sleva = 0.02;
} jiný-li (customerCode.toLowerCase().equals("Nový")) {
sleva = 0.05;
}vrátit se sleva;
}
// určení celkového součtu zákazníka na základě typu zákazníka
veřejnostdvojnásobekcelkový součet(dvojnásobek celkový){
dvojnásobek sleva = customerType (customerCode);
dvojnásobek slevaPercentage = celkem * sleva;
dvojnásobek finalTotal = celkem - slevaPercentage;
vrátit se finalTotal;
}
}
Tato třída Customer obsahuje všechny součásti třídy Java, doplněné dvěma metodami.
Vytvoření vnořeného testu pomocí JUnit 5
Třída Customer má několik konstruktorů, getterů a setterů a dvě metody. Můžete vytvořit vnořenou třídu (v rámci třídy Customer test), která vytvoří nový objekt Customer a otestuje všechny jeho součásti.
importstatickýorg.junit.Jupiter.api.Tvrzení.*;
importorg.junit.Jupiter.api.Zobrazovaný název;
importorg.junit.Jupiter.api.Vnořené;
importorg.junit.Jupiter.api.Test;@DisplayName("Zákaznická testovací třída ukazuje, jak na to VytvořitVnořeno Testy.")
třídaZákaznický test{
chráněnýint customerId = 301;
chráněný řetězec customerName = "Mike Wilson";
chráněný řetězec customerCode = "Před";
chráněnýdvojnásobek celkem = 600;@Vnořené
@Zobrazované jméno("Customer Builder vnořená testovací třída v rámci testovací třídy nejvyšší úrovně")
třídaCustomerBuilderTest{
Zákazník zákazník = Nový Zákazník (customerId, customerName, customerCode);
dvojnásobek grandTotal = customer.grandTotal (celkem);
@Test
@Zobrazované jméno("Testování zákazníka's Konstruktory tříd, gettery a nastavovače a metody.")
prázdnotacustomerBuilder(){
claimAll(() -> {
tvrdit Rovná se(zákaznické identifikační číslo, zákazník.getCustomerId());
tvrdit Rovná se(Jméno zákazníka, zákazník.getCustomerName());
tvrdit Rovná se(zákaznický kód, zákazník.getCustomerCode());
tvrdit Rovná se(0.10, zákazník.customerType(zákaznický kód));
claimEquals (540, grandTotal);
});
}
}
}
Třída CustomerTest je testovací třída nejvyšší úrovně k vnořené třídě CustomerBuilderTest. CustomerBuilderTest vytvoří nový objekt Customer a otestuje jeho komponenty pomocí asertivní testy.
Provedení testovací třídy CustomerTest vede k následujícím úspěšným výsledkům testu:
Názvy testovacích tříd a testovací metody jsou popisné a komplexní, díky @DisplayName Anotace.
Vědět, jak testovat software, je zásadní
Technologie jsou pro většinu lidí důležitou součástí každodenního života. Sázky na vytvoření softwaru, který dělá přesně to, co dělat má, nebyly nikdy vyšší.
Samořídící auto, které špatně spočítá svou blízkost k jinému objektu, může způsobit velkou nehodu. Svou aplikaci proto musíte otestovat v každé fázi jejího vývoje.