Una classe di test
L'unità fondamentale in JUnit è l'annotation @Test
, con essa è possibile definire un metodo come metodo di test. Al suo interno in generale si utilizzano asserzioni attraverso la classe Assertions
.
Le Annotation
Oltre a @Test
esistono molte altre annotation. Ne forniremo una breve descrizione seguita da un esempio di utilizzo rappresentato dalla classe di test mostrata a conclusione dell'articolo.
Annotation | Descrizione |
---|---|
@Display | Definire il nome di una classe di test diverso dal nome della classe stessa. |
@TestInstance | Configurare la gestione delle istanze di classi di test. Possiamo avere una singola istanza di classe per eseguire tutti i metodi di test o una nuova istanza per ciascun metodo. |
@BeforeEach | Eseguire un metodo prima di ogni altro, utile per definire metodi di inizializzazione. |
@ParameterizedTest | Avere metodi che accettano parametri. |
@Tag | Assegnare delle label identificative ai metodi. Utile quando si devono selezionare o escludere metodi specifici per il test. |
@Timeout | Validare il tempo di risposta di un metodo, se esso eccede il timeout configurato il test fallisce. |
@RepeatedTest | Eseguire un metodo un numero specificato di volte. Particolarmente utile per il test di microservizi al fine di verificare il comportamento del servizio stesso a seguito di ripetute richieste "phantom". |
@Order e @TestMethodOrder | Orchestrare l'esecuzione dei metodi decidendo l'ordine di esecuzione. |
@AfterEach | Utile per avere un metodo da eseguire per ultimo. |
Il codice della classe
La classe di test che consente di provare tutte le annotazioni presentate è la seguente:
import org.junit.Test;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import java.util.concurrent.TimeUnit;
@DisplayName(value="JUNIT Jupiter Test Class")
@TestInstance(value= TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class QuarkusTest {
@BeforeEach
public void setup(){
System.out.println("Setup");
}
@ParameterizedTest
@Tag("Tag1")
@ValueSource(strings = {"value1","value2"})
public void testWithValues(String value){
System.out.println(value);
}
@ParameterizedTest
@Tag("Tag1")
@CsvSource({"Tiger, selvatic","Dog, domestic","Lion, selvatic"})
public void loadValuesFromCsv(String animalName, String animalType){
Assertions.assertNotNull(animalName);
Assertions.assertNotNull(animalType);
}
@Test
@Tag("Tag 2")
@Timeout(value = 3, unit= TimeUnit.SECONDS)
public void testTimeoutException(){
try{
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
@RepeatedTest(4)
@DisplayName("Repeat")
public void repeatTest(RepetitionInfo repetitionInfo){
System.out.println("Repeat");
}
@Test
@Order(1)
public void testOrdered1(){
System.out.println("Test ordered 1");
}
@Test
@Order(2)
public void testOrdered2(){
System.out.println("Test ordered 2");
}
@AfterEach
public void cleanUp(){
System.out.println("Clean");
}
}
Per eseguire il test da IntelliJ fare click con il tasto destro sul nome della classe e scegliere "Run QuarkusTest":