Una suite di test ben scritta avrà diversi test per una funzionalità specifica. Raggruppando le funzionalità correlate, è possibile esprimere la relazione tra diversi gruppi di test. Uno dei principali vantaggi del raggruppamento delle classi di unit test è che può ridurre la quantità di codice di test che scrivi, poiché i test raggruppati condividono le risorse.

JUnit 5 consente di creare test nidificati utilizzando l'annotazione @Nested. In questo articolo imparerai cos'è l'annotazione @Nested e come usarla.

Che cos'è un test nidificato?

L'annotazione @Nested di JUnit segnala che la classe a cui si associa è una classe interna, ovvero un membro di un'altra classe. Un test nidificato è una classe di test che contiene l'annotazione @Nested, in quanto ciò significa che esiste una (o più) classe interna all'interno di una classe di test di primo livello. Una classe nidificata può apparire all'interno di una classe di primo livello o all'interno di una classe anch'essa nidificata.

Creazione di classi Java da testare

instagram viewer

Una classe di test nidificata eredita tutte le caratteristiche della sua classe genitore. Pertanto, il momento migliore per creare un test nidificato è quando esiste un raggruppamento logico di casi di test o quando un singolo caso di test ha caratteristiche diverse. Un buon esempio di questo è quando vuoi testare la capacità di una classe di creare oggetti utili. Un altro esempio è quando un singolo metodo ha due o più scopi.

Ecco una classe di esempio che potresti utilizzare in un'applicazione di vendita al dettaglio, che dimostra come creare un test annidato.

pubblicoclasseCliente{
protettoint identificativo del cliente;
protetto Stringa nomecliente;
protetto String codice cliente;

// costruttore predefinito
pubblicoCliente(){
Questo.customerId = 0;
Questo.customerName = "";
Questo.codicecliente="";
}

// costruttore primario
pubblicoCliente(int customerId, String customerName, String customerCode){
Questo.customerId = customerId;
Questo.nomecliente = nomecliente;
Questo.customerCode = codicecliente;
}

// copia il costruttore
pubblicoCliente(Cliente cliente){
Questo.customerId = cliente.customerId;
Questo.nomecliente = cliente.nomecliente;
Questo.customerCode = cliente.customerCode;
}

// getter e setter
pubblicointgetCustomerId(){
ritorno identificativo del cliente;
}

pubblicovuotosetCustomerId(int identificativo del cliente){
Questo.customerId = customerId;
}

pubblico Corda getNomeCliente(){
ritorno Nome del cliente;
}

pubblicovuotosetCustomerName(Stringa nomecliente){
Questo.nomecliente = nomecliente;
}

pubblico Corda ottenereCodiceCliente(){
ritorno codice CLIENTE;
}

pubblicovuotosetCustomerCode(StringaCodicecliente){
Questo.customerCode = codicecliente;
}

// determinare una percentuale di sconto cliente in base al tipo di cliente
pubblicoDoppiotipo di cliente(StringaCodicecliente){
Doppio sconto = 0;

Se (customerCode.toLowerCase().equals("pre")) {
sconto = 0.10;
} altroSe (customerCode.toLowerCase().equals("gen")) {
sconto = 0.02;
} altroSe (codicecliente.toLowerCase().equals("nuovo")) {
sconto = 0.05;
}

ritorno sconto;
}

// determina il grandTotal di un cliente in base al tipo di cliente
pubblicoDoppiosomma totale(Doppio totale){
Doppio sconto = tipocliente (codicecliente);
Doppio discountPercentage = totale * sconto;
Doppio finalTotal = totale - discountPercentage;
ritorno finaleTotale;
}
}

Questa classe Customer contiene tutti i componenti di una classe Java, completa di due metodi.

Creazione di un test nidificato con JUnit 5

La classe Customer ha diversi costruttori, getter e setter e due metodi. È possibile creare una classe nidificata (all'interno della classe di test Customer) che crea un nuovo oggetto Customer e verifica tutti i suoi componenti.

importarestaticoorg.junit.Giove.api.Asserzioni.*;

importareorg.junit.Giove.api.Nome da visualizzare;
importareorg.junit.Giove.api.Nidificato;
importareorg.junit.Giove.api.Test;

@DisplayName("Classe di test del cliente che mostra come CreareNidificato Test.")
classeClienteTest{
protettoint idcliente = 301;
protetto String customerName = "Mike Wilson";
protetto String codice cliente = "Pre";
protettoDoppio totale = 600;

@Nidificato
@Nome da visualizzare("Customer Builder Classe di test nidificata all'interno di una classe di test di primo livello")
classeCustomerBuilderTest{
Cliente cliente = nuovo Cliente (customerId, customerName, customerCode);
Doppio grandTotal = cliente.grandTotal (totale);

@Test
@Nome da visualizzare("Testare il cliente's Costruttori di classi, getter e setter e metodi.")
vuotocustomerBuilder(){
assertAll(() -> {
assertEquals(identificativo del cliente, cliente.getIdCliente());
assertEquals(Nome del cliente, cliente.getNomeCliente());
assertEquals(codice CLIENTE, cliente.getCodicecliente());
assertEquals(0.10, cliente.tipo di cliente(codice CLIENTE));
assertEquals (540, grandTotal);
});
}
}
}

La classe CustomerTest è la classe di test di primo livello per una classe CustomerBuilderTest nidificata. CustomerBuilderTest crea un nuovo oggetto Cliente e ne verifica i componenti utilizzando test di asserzione.

L'esecuzione della classe di test CustomerTest produce i seguenti risultati positivi del test:

I nomi delle classi di test e il metodo di test sono descrittivi ed esaustivi, grazie al @DisplayName Annotazione.

Sapere come testare il software è fondamentale

La tecnologia è un aspetto importante della vita quotidiana per la maggior parte delle persone. La posta in gioco per la creazione di software che fa esattamente quello che dovrebbe fare non è mai stata così alta.

Un'auto a guida autonoma che calcola male la sua vicinanza a un altro oggetto può causare un grave incidente. Pertanto, è necessario testare l'applicazione in ogni fase del suo sviluppo.