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.
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:
- 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.
- 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.
- 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:

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. |
