JUnit Tutorial Adnotări cu Exemplu: Ce este @Test și @After

⚡ Rezumat inteligent

JUnit Adnotările sunt o formă de metadate sintactice adăugate la Java cod sursă, astfel încât un rulator de teste să știe ce metode să execute, când să le execute și cât timp poate dura fiecare.

  • 🔘 @Test: Marchează o metodă public void care JUnit se execută ca un singur caz de testare.
  • ☑️ Ciclu de viață: @Before și @After încapsulează fiecare test, în timp ce @BeforeClass și @AfterClass încapsulează clasa.
  • Control: @Ignore sare peste un test, @Test(timeout) limitează timpul de execuție, @Test(expected) activează o excepție generată.
  • 🧪 Afirmații: org.junit.Assert furnizează assertEquals, assertTrue, assertNull, assertSame și fail().
  • 🛠️ Moştenire: TestCase, TestResult și TestSuite aparțin pachetului mai vechi junit.framework.
  • 📊 JUnit 5: Jupiter le redenumește în @BeforeEach, @AfterEach, @BeforeAll, @AfterAll și @Disabled.

JUnit tutorial despre adnotări care acoperă @Test, @Înainte și @După

Ce Este JUnit Adnotări?

JUnit adnotări sunt o formă specială de metadate sintactice care pot fi adăugate la Java cod sursă pentru o mai bună lizibilitate și structură a codului. Variabilele, parametrii, pachetele, metodele și clasele pot fi adnotate. Adnotările au fost introduse în JUnit 4, ceea ce face Java cod mai lizibil și mai simplu. Aceasta este marea diferență dintre JUnit 3 și JUnit 4: JUnit 4 se bazează pe adnotări.

Cu cunoștințe practice despre aceste adnotări, se poate învăța și implementa cu ușurință o JUnit Test. Mai jos este cel important și folosit frecvent JUnit listă de adnotări, cu JUnit 5 (Jupiter) echivalente lângă fiecare:

S.No. Adnotări Descriere JUnit 5 echivalente
1. @Test Această adnotare înlocuiește metoda junit.framework.TestCase și indică faptul că metoda public void la care este atașată poate fi executată ca un caz de testare. @Test (org.junit.jupiter.api)
2. @Inainte de Această adnotare este folosită dacă doriți să executați o instrucțiune, cum ar fi precondiții înainte de fiecare caz de testare. @ÎnainteDeFiecare
3. @Înainte de curs Această adnotare este utilizată dacă doriți să executați anumite instrucțiuni înaintea tuturor cazurilor de testare, de exemplu o conexiune de testare care trebuie deschisă înaintea tuturor cazurilor de testare. @ÎnainteDeToți
4. @După Această adnotare poate fi folosită dacă doriți să executați câteva instrucțiuni după fiecare Caz de testare, de exemplu resetarea variabilelor sau ștergerea fișierelor temporare. @DupăFiecare
5. @După clasa Această adnotare poate fi utilizată dacă doriți să executați anumite instrucțiuni după toate cazurile de testare, de exemplu, eliberarea resurselor după executarea tuturor cazurilor de testare. @La urma urmelor
6. @Ignora Această adnotare poate fi utilizată dacă doriți să ignorați anumite instrucțiuni în timpul execuției testului, de exemplu, dezactivarea unor cazuri de testare în timpul execuției testului. @Dezactivat
7. @Test(timeout=500) Această adnotare poate fi utilizată dacă doriți să setați un anumit timeout în timpul execuției testului, de exemplu dacă lucrați în baza unui SLA (acord privind nivelul serviciilor) și testele trebuie finalizate într-un interval de timp specificat. @Timeout sau assertTimeout
8. @Test(expected=IllegalArgumentException.class) Această adnotare poate fi utilizată dacă doriți să gestionați o anumită excepție în timpul execuției testului. De exemplu, dacă doriți să verificați dacă o anumită metodă generează o anumită excepție sau nu. assertThrows

JUnit Exemplu de adnotări

Să creăm o clasă care acoperă important JUnit adnotări cu instrucțiuni simple de tipărire și executați-o cu o clasă test runner:

Pas 1) Luați în considerare cele de mai jos Java clasă având diverse metode atașate adnotărilor enumerate mai sus:

JunitAdnotationsExample.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");					

    }		

}		

Pas 2) Să creăm o clasă de testare pentru a executa testul de mai sus:

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());							
   }		
}      	

rezultat asteptat

  • Toate cazurile de testare vor fi executate unul câte unul, iar toate instrucțiunile de tipărire pot fi văzute pe o consolă.
  • Așa cum s-a discutat în tabelul de mai sus, @Before și @BeforeClass în JUnit [metodele m2() și m1()] vor fi executate înaintea fiecărui caz de testare și, respectiv, înaintea tuturor cazurilor de testare.
  • În același mod, @After și @AfterClass în JUnit (metodele m4() și m3()) vor fi executate după fiecare caz de testare și, respectiv, după toate cazurile de testare. @Ignore (metoda m6()) va fi tratată ca ignorând testul.

Să analizăm cazurile de testare utilizate în cele de mai sus Java clasa in detaliu:

  1. Luați în considerare metoda m5() așa cum este dată mai jos:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

În metoda de mai sus, pe măsură ce adăugați un șir de caractere la variabila „list”:

  • list.isEmpty() va returna false.
  • assertFalse(list.isEmpty()) trebuie să revină adevărat.
  • Ca rezultat, cazul de testare va trece.

Deoarece ați adăugat un singur șir de caractere la listă, dimensiunea este unu.

  • list.size() trebuie să returneze valoarea întreagă „1”.
  • So assertEquals(1, list.size()) trebuie să revină adevărat.
  • Ca rezultat, cazul de testare va trece.
  1. Luați în considerare metoda m7() așa cum este dată mai jos:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

După cum sa discutat mai sus, @Test(timeout = 10) este folosit pentru a impune un timeout în cazul de testare. Valoarea este în milisecunde, deci m7() trebuie să se termine în 10 ms.

  1. Luați în considerare metoda m8() așa cum este dată mai jos:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

După cum sa discutat mai sus, @Test (așteptată) va verifica excepția specificată în timpul execuției sale, așadar metoda m8() va genera eroarea „No Such Method Exception” (Nu există o astfel de excepție de metodă). Drept urmare, testul va fi executat cu o excepție.

Notă de precizie: m8() afișează doar o linie, deci excepția declarată nu este niciodată aruncată și JUnit 4 raportează testul ca eșuat. Aliniați tipul așteptat cu ceea ce dă metoda în realitate. JUnit 5 scrie asta cu assertThrows.

Pe măsură ce toate cazurile de testare sunt trecute, acest lucru are ca rezultat o execuție cu succes a testului.

Rezultat actual

Deoarece în exemplul de mai sus există trei cazuri de testare, toate cazurile de testare vor fi executate unul câte unul. Vedeți captura de ecran a consolei de mai jos:

Eclipse ieșirea consolei care afișează instrucțiunile de imprimare @BeforeClass, @Before, @After și @AfterClass
Rezultatul consolei produs de JunitAnnotationsExample

Vedeți mai jos declarațiile tipărite care pot fi văzute pe consolă:

Folosind @BeforeClass , executat înainte de toate cazurile de testare

Folosind adnotări @Before, executate înainte de fiecare caz de testare

Folosind @After, executat după fiecare caz de testare

Folosind adnotări @Before, executate înainte de fiecare caz de testare

Folosind @Test(timeout), poate fi folosit pentru a impune timeout-ul în JUnit4 caz de testare

Folosind @After, executat după fiecare caz de testare

Folosind adnotări @Before, executate înainte de fiecare caz de testare

Folosind @Test(expected) , va verifica excepția specificată în timpul execuției sale

Folosind @After, executat după fiecare caz de testare

Folosind @AfterClass, executat după toate cazurile de testare

JUnit Clasa Assert

Adnotările decid când rulează o metodă; metodele de afirmare decid dacă aceasta trece.

Această clasă oferă o serie de metode de aserțiune utile în scrierea unui caz de testare. Dacă toate instrucțiunile de aserțiune sunt trecute, rezultatele testului sunt considerate reușite. Dacă vreo instrucțiune de aserțiune eșuează, rezultatele testului sunt considerate eșuate. Clasa dedicată JUnit afirma Tutorialul acoperă fiecare metodă în detaliu.

După cum ați văzut anterior, tabelul de mai jos descrie metodele Assert importante și descrierea lor:

S.No. Metodă Descriere
1. void assertEquals (boolean așteptat, boolean actual) Verifică dacă două valori sunt egale, similar metodei equals din clasa Object.
2. void assertFalse (condiție booleană) Funcționalitatea este de a verifica dacă o condiție este falsă.
3. void assertNotNull (obiect obiect) Funcționalitatea „assertNotNull” este de a verifica dacă un obiect nu este nul.
4. void assertNull (Obiect obiect) Funcționalitatea „assertNull” este de a verifica dacă un obiect este nul.
5. void assertTrue (condiție booleană) Funcționalitatea „assertTrue” este de a verifica dacă o condiție este adevărată.
6. void fail() Dacă vrei să generezi o eroare de aserțiune, fail() are ca rezultat întotdeauna un verdict de eșec.
7. void assertSame([String message] Funcționalitatea „assertSame” este de a verifica dacă cele două obiecte se referă la același obiect.
8. void assertNotSame([String message] Funcționalitatea „assertNotSame” este de a verifica dacă cele două obiecte nu se referă la același obiect.

JUnit Clasa de cazuri de testare

Pentru a rula mai multe teste, clasa TestCase este disponibilă în junit.framework pachet. Adnotarea @Test spune JUnit ca această metodă public void (un caz de testare aici) la care este atașată să poată fi rulată ca un caz de testare.

Notă privind versiunea: TestCase, Rezultatul testului și TestSuite aparțin moștenirii junit.framework pachet de la JUnit 3. Încă sunt livrate în interiorul artefactului junit 4.x, dar testele bazate pe adnotări nu extind TestCase.

Tabelul de mai jos prezintă câteva metode importante disponibile în junit.framework.TestCase clasă:

S.No. Metodă Descriere
1. int countTestCases() Această metodă este utilizată pentru a număra câte cazuri de testare sunt executate de run(TestResult tr) metodă.
2. TestResult createResult() Această metodă este folosită pentru a crea un Rezultatul testului obiect.
3. String getName() Această metodă returnează un șir care nu este altceva decât a TestCase nume.
4. TestResult run() Această metodă este utilizată pentru a executa un test, care returnează un Rezultatul testului obiect.
5. void run (rezultat TestResult) Această metodă este utilizată pentru a executa un test având a Rezultatul testului obiect, care nu returnează nimic.
6. void setName(nume șir) Această metodă este utilizată pentru a seta numele unui TestCase.
7. void setUp() Această metodă este utilizată pentru a scrie cod de asociere a resurselor, de exemplu pentru a crea o conexiune la baza de date.
8. Vod TearDown() Această metodă este utilizată pentru a scrie cod de eliberare a resurselor, de exemplu, eliberarea unei conexiuni la baza de date după efectuarea unei operațiuni de tranzacție.

JUnit Clasa TestResult

Când executați un test, acesta returnează un rezultat (sub forma unui Rezultatul testului Acest obiect TestResult poate fi utilizat pentru a analiza obiectul rezultat. Rezultatul testului poate fi fie eșec, fie succes.

Consultați tabelul de mai jos pentru metodele importante utilizate în clasa junit.framework.TestResult:

S.No. Metodă Descriere
1. void addError(Test test, Throwable t) Această metodă este utilizată dacă trebuie să adăugați o eroare la test.
2. void addFailure (Test de testare, AssertionFailedError t) Această metodă este utilizată dacă trebuie să adăugați o eroare la lista de erori.
3. void endTest (test de testare) Această metodă este utilizată pentru a notifica că un test a fost efectuat (finalizat).
4. int errorCount() Această metodă este utilizată pentru a detecta erorile în timpul execuției testului.
5. Enumerare erori() Această metodă returnează pur și simplu o colecție (o enumerare aici) de erori.
6. int failureCount() Această metodă este utilizată pentru a obține numărul de erori detectate în timpul execuției testului.
7. void run (test TestCase) Această metodă este utilizată pentru a executa un caz de testare.
8. int runCount() Această metodă numără pur și simplu testele executate.
9. void startTest (test de testare) Această metodă este utilizată pentru a notifica că a început un test.
10. void stop() Această metodă este utilizată pentru a opri rularea testului.

JUnit Clasa Test Suite

Dacă doriți să executați mai multe teste într-o ordine specificată, acest lucru se poate face prin combinarea tuturor testelor într-un singur loc. Acest loc se numește suită de teste, iar JUnit suită de testare Tutorialul prezintă un exemplu complet.

Consultați tabelul de mai jos pentru metodele importante utilizate în junit.framework.TestSuite clasă:

S.No. Metodă Descriere
1. void addTest (test de testare) Această metodă este folosită dacă doriți să adăugați un test la suită.
2. void addTestSuite(Class testClass) Această metodă este folosită dacă doriți să specificați clasa în timp ce adăugați un test la suită.
3. int countTestCases() Această metodă este utilizată dacă doriți să numărați numărul de cazuri de testare.
4. String getName() Această metodă este folosită pentru a obține numele suitei de testare.
5. void run (rezultat TestResult) Această metodă este utilizată pentru a executa un test și a colecta rezultatul testului într-un Rezultatul testului obiect.
6. void setName(nume șir) Această metodă este utilizată pentru a seta numele TestSuite.
7. Testare testAt(index int) Această metodă este utilizată dacă doriți să returnați testul la un index dat.
8. int testCount() Această metodă este utilizată dacă doriți să returnați numărul de teste din suită.
9. Avertisment de testare static (mesaj șir) Această metodă returnează un test care va eșua și va înregistra un mesaj de avertizare.

Întrebări frecvente

Da. O metodă poartă de obicei @Test împreună cu @Ignore sau @Test cu atât un timeout, cât și o excepție așteptată. Nu puteți suprapune două adnotări ale ciclului de viață, cum ar fi @Before și @After, pe o singură metodă.

@Ignore suprimă doar o metodă JUnit deja recunoaște ca test. Fără @Test lângă acesta, executantul nu colectează niciodată metoda, deci nu este nici executată, nici listată ca omisă.

JUnit Rulează metoda pe un fir de execuție separat și eșuează cu o excepție TestTimedOutException odată ce bugetul expiră. Firul de execuție este întrerupt, nu închis, așadar un apel blocant poate continua să ruleze.

Numai prin intermediul motorului vintage. Adăugarea junit-vintage-engine permite JUnit Platforma rulează testele org.junit existente neschimbate, dar testele Jupiter trebuie să importe org.junit.jupiter.api. Combinarea ambelor seturi de import într-o singură clasă eșuează.

Numai pentru mentenanță. Suitele vechi care extind TestCase și construiesc obiecte TestSuite rămân comune în bazele de cod mai vechi, așa că recunoașterea API-ului ajută. Noile teste ar trebui să fie bazate pe adnotări.

JUnit construiește o nouă instanță a clasei de testare pentru fiecare metodă de testare, astfel încât nicio instanță să nu existe atunci când trebuie să ruleze configurarea la nivel de clasă. O metodă statică nu necesită nicio instanță și JUnit respinge o declarație nestatică.

Asistenții inteligenți artificiali citesc metoda testată și sugerează dacă configurarea aparține în @Before sau @BeforeClass și dacă o cale de eroare necesită @Test(expected) sau assertThrows. Tratați fiecare sugestie ca pe o schiță.

Copilotul GitHub de obicei, montajul și demontajul se realizează corect, dar se amestecă frecvent JUnit 4 și importurile Jupiter într-un singur fișier. Verificați blocul de import înainte de a rula suita.

Rezumați această postare cu: