JUnit Tutorial sulle annotazioni con esempio: cosa sono @Test e @After

โšก Riepilogo intelligente

JUnit le annotazioni sono una forma di metadati sintattici aggiunti a Java il codice sorgente in modo che chi esegue i test sappia quali metodi eseguire, quando eseguirli e quanto tempo ciascuno potrebbe richiedere.

  • ๐Ÿ”˜ @Test: Segna un metodo pubblico vuoto che JUnit viene eseguito come singolo caso di test.
  • โ˜‘๏ธ Ciclo vitale: Gli annotazioni @Before e @After racchiudono ogni test, mentre @BeforeClass e @AfterClass racchiudono la classe.
  • โœ… Controllo: @Ignore salta un test, @Test(timeout) limita il tempo di esecuzione, @Test(expected) verifica un'eccezione generata.
  • ๐Ÿงช Affermazioni: org.junit.Assert fornisce assertEquals, assertTrue, assertNull, assertSame e fail().
  • ๏ธ Ereditร : TestCase, TestResult e TestSuite appartengono al pacchetto junit.framework, che รจ piรน vecchio.
  • ๐Ÿ“Š JUnit 5: Jupiter li rinomina in @BeforeEach, @AfterEach, @BeforeAll, @AfterAll e @Disabled.

JUnit Tutorial sulle annotazioni che illustra @Test, @Before e @After

Cosa รจ JUnit Annotazioni?

JUnit annotazioni sono una forma speciale di metadati sintattici che possono essere aggiunti a Java codice sorgente per una migliore leggibilitร  e struttura del codice. Variabili, parametri, pacchetti, metodi e classi possono essere annotati. Le annotazioni sono state introdotte in JUnit 4, che fa Java codice piรน leggibile e semplice. Questa รจ la grande differenza tra JUnit 3 e JUnit 4: JUnit 4 รจ basato sulle annotazioni.

Con una conoscenza pratica di queste annotazioni, si puรฒ facilmente imparare e implementare un JUnit test. Di seguito รจ riportato l'importante e utilizzato di frequente JUnit elenco delle annotazioni, con il JUnit 5 (Giove) equivalente accanto a ciascuno:

S.No. Annotazioni Descrizione JUnit 5 equivalent
1. @Test Questa annotazione sostituisce junit.framework.TestCase e indica che il metodo pubblico void a cui รจ associata puรฒ essere eseguito come caso di test. @Test (org.junit.jupiter.api)
2. @Prima Questa annotazione viene utilizzata se si desidera eseguire alcune istruzioni come le precondizioni prima di ogni caso di test. @PrimaDiOgni
3. @Prima della lezione Questa annotazione viene utilizzata se si desidera eseguire alcune istruzioni prima di tutti i casi di test, ad esempio una connessione di test che deve essere aperta prima di tutti i casi di test. @PrimaDiTutto
4. @Dopo Questa annotazione puรฒ essere utilizzata se si desidera eseguire alcune istruzioni dopo ciascuna Test Case, ad esempio reimpostando le variabili o eliminando i file temporanei. @DopoOgni
5. @Dopo la lezione Questa annotazione puรฒ essere utilizzata se si desidera eseguire alcune istruzioni dopo tutti i casi di test, ad esempio rilasciare le risorse dopo l'esecuzione di tutti i casi di test. @Dopotutto
6. @Ignorare Questa annotazione puรฒ essere utilizzata se si desidera ignorare alcune istruzioni durante l'esecuzione del test, ad esempio disabilitando alcuni casi di test durante l'esecuzione del test. @Disabilitato
7. @Test(timeout=500) Questa annotazione puรฒ essere utilizzata se si desidera impostare un timeout durante l'esecuzione dei test, ad esempio se si lavora in base a un SLA (accordo sul livello di servizio) e i test devono essere completati entro un tempo specificato. @Timeout o assertTimeout
8. @Test(expected=IllegalArgumentException.class) Questa annotazione puรฒ essere utilizzata se si desidera gestire alcune eccezioni durante l'esecuzione del test. Ad esempio, se si desidera verificare se un determinato metodo genera o meno un'eccezione specificata. assertThrows

JUnit Esempio di annotazioni

Creiamo una classe che copra importanti JUnit annotazioni con semplici istruzioni print ed eseguilo con una classe test runner:

Passo 1) Considera quanto segue Java classe dotata di vari metodi associati alle annotazioni sopra elencate:

Esempio di annotazioni Junit.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Passo 2) Creiamo una classe di esecuzione test per eseguire il test sopra descritto:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Risultato atteso

  • Tutti i casi di test verranno eseguiti uno alla volta e tutte le istruzioni di stampa saranno visibili sulla console.
  • Come discusso nella tabella precedente, @Before e @BeforeClass in JUnit [ I metodi m2() e m1() ] verranno eseguiti rispettivamente prima di ogni caso di test e prima di tutti i casi di test.
  • Allo stesso modo @After e @AfterClass in JUnit I metodi m4() e m3() verranno eseguiti rispettivamente dopo ogni caso di test e dopo tutti i casi di test. Il metodo m6() (@Ignore) verrร  interpretato come l'ignorare il test.

Analizziamo i casi di test utilizzati nel precedente Java lezione nel dettaglio:

  1. Si consideri il metodo m5() come indicato di seguito:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Nel metodo sopra descritto, poichรฉ stai aggiungendo una stringa alla variabile "list":

  • lista.รจVuoto() restituirร  falso.
  • assertFalse(list.isEmpty()) deve restituire vero.
  • Di conseguenza, il caso di prova lo farร  passare.

Poichรฉ hai aggiunto una sola stringa all'elenco, la dimensione รจ uno.

  • lista.dimensione() deve restituire il valore intero "1".
  • So assertEquals(1, list.size()) deve restituire vero.
  • Di conseguenza, il caso di prova lo farร  passare.
  1. Si consideri il metodo m7() come indicato di seguito:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Come discusso sopra, @Test(timeout = 10) viene utilizzato per imporre un timeout nel caso di test. Il valore รจ espresso in millisecondi, quindi m7() deve terminare entro 10 ms.

  1. Si consideri il metodo m8() come indicato di seguito:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Come discusso sopra, @Test(previsto) Verrร  verificata la presenza dell'eccezione specificata durante l'esecuzione, quindi il metodo m8() genererร  "No Such Method Exception". Di conseguenza, il test verrร  eseguito con un'eccezione.

Nota di accuratezza: m8() stampa solo una riga, quindi l'eccezione dichiarata non viene mai effettivamente lanciata e JUnit 4 segnala che il test รจ fallito. Allineare il tipo previsto con quello effettivamente generato dal metodo. JUnit 5 scrive questo con assertThrows.

Poichรฉ tutti i casi di test vengono superati, ciรฒ si traduce in un'esecuzione corretta del test.

Risultato attuale

Poichรฉ nell'esempio precedente sono presenti tre casi di test, tutti i casi di test verranno eseguiti uno alla volta. Vedi lo screenshot della console qui sotto:

Eclipse Output della console che mostra le istruzioni print @BeforeClass, @Before, @After e @AfterClass
Output della console prodotto da JunitAnnotationsExample

Vedi sotto le istruzioni print che possono essere visualizzate sulla console:

Utilizzando @BeforeClass , eseguito prima di tutti i casi di test

Utilizzando le annotazioni @Before, eseguite prima di ogni caso di test

Utilizzando @After, eseguito dopo ogni caso di test

Utilizzando le annotazioni @Before, eseguite prima di ogni caso di test

Utilizzando @Test(timeout), puรฒ essere utilizzato per imporre il timeout JUnit4 casi di prova

Utilizzando @After, eseguito dopo ogni caso di test

Utilizzando le annotazioni @Before, eseguite prima di ogni caso di test

Utilizzando @Test(expected), controllerร  l'eccezione specificata durante la sua esecuzione

Utilizzando @After, eseguito dopo ogni caso di test

Utilizzando @AfterClass, eseguito dopo tutti i casi di test

JUnit Asserisci classe

Le annotazioni determinano quando un metodo viene eseguito; i metodi assert decidono se ha esito positivo.

Questa classe fornisce una serie di metodi di asserzione utili per scrivere un caso di test. Se tutte le istruzioni di asserzione vengono superate, i risultati del test sono positivi. Se una qualsiasi istruzione di asserzione fallisce, i risultati del test sono negativi. Il dedicato JUnit affermare Il tutorial illustra ciascun metodo in dettaglio.

Come avete visto in precedenza, la tabella seguente descrive i principali metodi Assert e la loro descrizione:

S.No. Metodo Descrizione
1. void assertEquals(booleano previsto, booleano effettivo) Questo metodo verifica se due valori sono uguali, in modo simile al metodo equals della classe Object.
2. void assertFalse(condizione booleana) La funzionalitร  consiste nel verificare che una condizione sia falsa.
3. void assertNotNull(Oggetto oggetto) La funzionalitร  "assertNotNull" consiste nel verificare che un oggetto non sia nullo.
4. void assertNull(Oggetto oggetto) La funzionalitร  "assertNull" consiste nel verificare che un oggetto sia nullo.
5. void assertTrue(condizione booleana) La funzionalitร  "assertTrue" serve a verificare che una condizione sia vera.
6. vuoto fallito() Se si desidera generare un errore di asserzione, fail() restituisce sempre un verdetto di fallimento.
7. void assertSame([Messaggio stringa] La funzionalitร  "assertSame" consiste nel verificare che i due oggetti si riferiscano allo stesso oggetto.
8. void assertNotSame([Messaggio stringa] La funzionalitร  "assertNotSame" consiste nel verificare che i due oggetti non si riferiscano allo stesso oggetto.

JUnit Classe Casi di test

Per eseguire piรน test, la classe TestCase รจ disponibile in junit.framework pacchetto. L'annotazione @Test dice JUnit che questo metodo pubblico void (un caso di test in questo caso) a cui รจ collegato possa essere eseguito come caso di test.

Nota sulla versione: Caso di prova, Risultato del test and Suite di prova appartenere all'ereditร  junit.framework pacchetto da JUnit 3. Vengono ancora distribuiti all'interno dell'artefatto JUnit 4.x, ma i test basati su annotazioni non estendono TestCase.

La tabella seguente mostra alcuni metodi importanti disponibili nel junit.framework.TestCase classe:

S.No. Metodo Descrizione
1. int countTestCases() Questo metodo viene utilizzato per contare quanti casi di test vengono eseguiti dal esegui(RisultatoTesttr) metodo.
2. RisultatoTestcreaRisultato() Questo metodo viene utilizzato per creare un file Risultato del test oggetto.
3. String getNome() Questo metodo restituisce una stringa che non รจ altro che a Caso di prova nome.
4. Esegui risultato test() Questo metodo viene utilizzato per eseguire un test, che restituisce un Risultato del test oggetto.
5. esecuzione nulla (risultato TestResult) Questo metodo viene utilizzato per eseguire un test avente a Risultato del test oggetto che non restituisce nulla.
6. void setName(Nome stringa) Questo metodo viene utilizzato per impostare il nome di un Caso di prova.
7. configurazione nulla() Questo metodo viene utilizzato per scrivere codice di associazione delle risorse, ad esempio per creare una connessione al database.
8. smontaggio vuoto() Questo metodo viene utilizzato per scrivere codice di rilascio delle risorse, ad esempio per rilasciare una connessione al database dopo aver eseguito un'operazione di transazione.

JUnit Classe TestResult

Quando esegui un test, restituisce un risultato (sotto forma di Risultato del test oggetto). Questo oggetto TestResult puรฒ essere utilizzato per analizzare l'oggetto risultante. Il risultato del test puรฒ essere positivo o negativo.

Consulta la tabella seguente per i metodi importanti utilizzati nella classe junit.framework.TestResult:

S.No. Metodo Descrizione
1. void addError(Test test, Throwable t) Questo metodo viene utilizzato se รจ necessario aggiungere un errore al test.
2. void addFailure(Test test, AssertionFailedError t) Questo metodo viene utilizzato se รจ necessario aggiungere un errore all'elenco degli errori.
3. void endTest(Test di prova) Questo metodo viene utilizzato per notificare che un test รจ stato eseguito (completato).
4. int errorCount() Questo metodo viene utilizzato per ottenere gli errori rilevati durante l'esecuzione del test.
5. Enumerazione errori() Questo metodo restituisce semplicemente una raccolta (in questo caso un'enumerazione) di errori.
6. int FailureCount() Questo metodo viene utilizzato per ottenere il conteggio degli errori rilevati durante l'esecuzione del test.
7. esecuzione nulla (test TestCase) Questo metodo viene utilizzato per eseguire un caso di test.
8. int runCount() Questo metodo si limita a contare i test eseguiti.
9. void startTest(Test di prova) Questo metodo viene utilizzato per notificare l'avvio di un test.
10 vuoto stop() Questo metodo viene utilizzato per interrompere l'esecuzione del test.

JUnit Classe della suite di prova

Se si desidera eseguire piรน test in un ordine specificato, รจ possibile farlo combinando tutti i test in un unico posto. Questo posto รจ chiamato suite di test e il JUnit suite di test Il tutorial illustra un esempio completo.

Vedi la tabella sottostante per i metodi importanti utilizzati nel junit.framework.TestSuite classe:

S.No. Metodo Descrizione
1. void addTest(Test di prova) Questo metodo viene utilizzato se si desidera aggiungere un test alla suite.
2. void addTestSuite(Class provaClass) Questo metodo viene utilizzato se si desidera specificare la classe durante l'aggiunta di un test alla suite.
3. int countTestCases() Questo metodo viene utilizzato se si desidera contare il numero di casi di test.
4. String getNome() Questo metodo viene utilizzato per ottenere il nome della suite di test.
5. esecuzione nulla (risultato TestResult) Questo metodo viene utilizzato per eseguire un test e raccogliere il risultato del test in un Risultato del test oggetto.
6. void setName(Nome stringa) Questo metodo viene utilizzato per impostare il nome del Suite di prova.
7. Prova testAt(int indice) Questo metodo viene utilizzato se si desidera restituire il test in un determinato indice.
8. int testCount() Questo metodo viene utilizzato se si desidera restituire il numero di test nella suite.
9. Avviso test statico (messaggio String) Questo metodo restituisce un test che fallirร  e registrerร  un messaggio di avviso.

DOMANDE FREQUENTI

Sรฌ. Un metodo comunemente include l'annotazione @Test insieme a @Ignore, oppure @Test con entrambi i parametri: un timeout e un'eccezione prevista. Non รจ possibile aggiungere due annotazioni del ciclo di vita, come @Before e @After, a un singolo metodo.

@Ignore sopprime solo un metodo JUnit giร  riconosciuto come test. Senza @Test accanto, il runner non raccoglie mai il metodo, quindi non viene nรฉ eseguito nรฉ elencato come saltato.

JUnit Il metodo viene eseguito su un thread separato e fallisce con un'eccezione TestTimedOutException allo scadere del budget. Il thread viene interrotto, non terminato, quindi una chiamata bloccante potrebbe continuare a essere eseguita.

Solo tramite il motore vintage. L'aggiunta di junit-vintage-engine consente il JUnit La piattaforma esegue i test org.junit esistenti senza modifiche, ma i test Jupiter devono importare org.junit.jupiter.api. Mescolare entrambi i set di importazioni in una singola classe non funziona.

Solo per la manutenzione. Le suite legacy che estendono TestCase e creano oggetti TestSuite sono ancora comuni nei codebase piรน vecchi, quindi riconoscere l'API รจ utile. I nuovi test dovrebbero essere basati su annotazioni.

JUnit crea una nuova istanza della classe di test per ogni metodo di test, quindi non ne esiste alcuna quando deve essere eseguita la configurazione a livello di classe. Un metodo statico non necessita di istanza e JUnit rifiuta una dichiarazione non statica.

Gli assistenti IA leggono il metodo da testare e suggeriscono se la configurazione debba essere inserita in @Before o @BeforeClass, e se un percorso di errore richieda @Test(expected) o assertThrows. Considera ogni suggerimento come una bozza.

Copilota GitHub di solito posiziona correttamente l'allestimento e lo smontaggio, ma spesso mescola JUnit Importazioni di 4 e Jupiter in un unico file. Verificare il blocco di importazione prima di eseguire la suite.

Riassumi questo post con: