JUnit Annotations Tutorial s primjerom: Što je @Test i @After

⚡ Pametni sažetak

JUnit Anotacije su oblik sintaktičkih metapodataka koji se dodaju Java izvorni kod kako bi izvršavatelj testa znao koje metode izvršiti, kada ih pokrenuti i koliko vremena svaka može trajati.

  • 🔘 @Test: Označava javnu void metodu koja JUnit izvršava se kao jedan testni slučaj.
  • ☑️ Životni ciklus: @Before i @After omotavaju svaki test, dok @BeforeClass i @AfterClass omotavaju klasu.
  • Kontrolirati: @Ignore preskače test, @Test(timeout) ograničava vrijeme izvođenja, @Test(expected) ispostavlja izbačenu iznimku.
  • 🧪 Tvrdnje: org.junit.Assert nudi assertEquals, assertTrue, assertNull, assertSame i fail().
  • 🛠️ Naslijeđe: TestCase, TestResult i TestSuite pripadaju starijem paketu junit.framework.
  • 📊 JUnit 5: Jupiter ih preimenuje u @BeforeEach, @AfterEach, @BeforeAll, @AfterAll i @Disabled.

JUnit Vodič za napomene koji pokriva @Test, @Before i @After

Što je JUnit Bilješke?

JUnit bilješke su poseban oblik sintaktičkih metapodataka koji se mogu dodati Java izvorni kod radi bolje čitljivosti i strukture koda. Varijable, parametri, paketi, metode i klase mogu se označavati. Anotacije su uvedene u JUnit 4, što čini Java kod čitljiviji i jednostavniji. To je velika razlika između JUnit 3 i JUnit 4: JUnit 4 se temelji na bilješkama.

S praktičnim znanjem ovih napomena, lako se može naučiti i implementirati JUnit test. Ispod je važno i često korišteno JUnit popis napomena, s JUnit 5 (Jupiter) ekvivalent pored svakog:

S.No. Bilješke Description JUnit 5 ekvivalenta
1. @Test Ova anotacija je zamjena za junit.framework.TestCase i označava da se metoda public void kojoj je pridružena može izvršiti kao testni slučaj. @Test (org.junit.jupiter.api)
2. @Prije Ova se napomena koristi ako želite izvršiti neku naredbu kao što su preduvjeti prije svakog testnog slučaja. @PrijeSvakog
3. @Prije Klase Ova se anotacija koristi ako želite izvršiti neke naredbe prije svih testnih slučajeva, na primjer testnu vezu koja se mora otvoriti prije svih testnih slučajeva. @PrijeSvega
4. @Nakon Ova se napomena može koristiti ako želite izvršiti neke naredbe nakon svake Testni slučaj, na primjer resetiranje varijabli ili brisanje privremenih datoteka. @NakonSvakog
5. @Nakon nastave Ova se anotacija može koristiti ako želite izvršiti neke naredbe nakon svih testnih slučajeva, na primjer oslobađanje resursa nakon izvršavanja svih testnih slučajeva. @Nakon svega
6. @Zanemariti Ova se anotacija može koristiti ako želite ignorirati neke naredbe tijekom izvođenja testa, na primjer onemogućiti neke testne slučajeve tijekom izvođenja testa. @Onemogućeno
7. @Test(timeout=500) Ova se napomena može koristiti ako želite postaviti neko vremensko ograničenje tijekom izvršavanja testa, na primjer ako radite pod SLA-om (ugovor o razini usluge) i testovi se moraju dovršiti unutar određenog vremena. @Timeout ili assertTimeout
8. @Test(očekivano=IllegalArgumentException.class) Ova se anotacija može koristiti ako želite obraditi neku iznimku tijekom izvršavanja testa. Na primjer, ako želite provjeriti baca li određena metoda navedenu iznimku ili ne. assertThrows

JUnit Primjer komentara

Kreirajmo razred koji pokriva važno JUnit primjedbe s jednostavnim izjavama za ispis i izvršite ih s klasom pokretača testova:

Korak 1) Razmotrite sljedeće Java klasa s raznim metodama koje su pridružene gore navedenim anotacijama:

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

    }		

}		

Korak 2) Napravimo klasu za izvršavanje testova za izvršavanje gornjeg testa:

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

očekivani rezultat

  • Svi testni slučajevi će se izvršavati jedan po jedan, a sve naredbe za ispis mogu se vidjeti na konzoli.
  • Kao što je objašnjeno u gornjoj tablici, @Before i @BeforeClass u JUnit [metode m2() i m1()] će se izvršiti prije svakog testnog slučaja i prije svih testnih slučajeva.
  • Na isti način @After i @AfterClass u JUnit (metode m4() i m3()) će se izvršiti nakon svakog testnog slučaja i nakon svih testnih slučajeva. @Ignore (metoda m6()) će se tretirati kao ignoriranje testa.

Analizirajmo testne slučajeve korištene u gore navedenom Java razred detaljno:

  1. Razmotrimo metodu m5() kako je prikazano u nastavku:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

U gornjoj metodi, dok dodajete niz znakova varijabli "list":

  • list.isEmpty() vratit će false.
  • assertFalse(list.isEmpty()) mora vratiti true.
  • Kao rezultat toga, testni slučaj će pass.

Budući da ste na popis dodali samo jedan niz, veličina je jedan.

  • list.size() mora vratiti cijeli broj vrijednosti "1".
  • So assertEquals(1, list.size()) mora vratiti true.
  • Kao rezultat toga, testni slučaj će pass.
  1. Razmotrimo metodu m7() kako je prikazano u nastavku:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Kao što je gore navedeno, @Test(timeout = 10) koristi se za nametanje vremenskog ograničenja u testnom slučaju. Vrijednost je u milisekundama, tako da m7() mora završiti unutar 10 ms.

  1. Razmotrimo metodu m8() kako je prikazano u nastavku:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Kao što je gore navedeno, @Test(očekivano) provjerit će navedenu iznimku tijekom svog izvršavanja, pa će metoda m8() izbaciti "Nema takve iznimke metode." Kao rezultat toga, test će se izvršiti s iznimkom.

Napomena o točnosti: m8() ispisuje samo liniju, tako da se deklarirana iznimka nikada zapravo ne baca i JUnit 4 prijavljuje neuspjeh testa. Uskladite očekivani tip s onim što metoda stvarno baca. JUnit 5 piše ovo s assertThrows.

Budući da su svi testni slučajevi prošli, to rezultira uspješnim izvršenjem testa.

Stvarni rezultat

Budući da u gornjem primjeru postoje tri testna slučaja, svi će se izvršavati jedan po jedan. Pogledajte snimku zaslona konzole u nastavku:

Eclipse izlaz konzole koji prikazuje naredbe za ispis @BeforeClass, @Before, @After i @AfterClass
Izlaz konzole koji generira JunitAnnotationsExample

Pogledajte dolje ispisane izjave koje se mogu vidjeti na konzoli:

Korištenje @BeforeClass, izvršeno prije svih testnih slučajeva

Korištenje napomena @Before, koje se izvode prije svakog testnog slučaja

Korištenje @After, izvršava se nakon svakog testa

Korištenje napomena @Before, koje se izvode prije svakog testnog slučaja

Korištenje @Test(timeout), može se koristiti za nametanje vremenskog ograničenja JUnit4 testni slučaj

Korištenje @After, izvršava se nakon svakog testa

Korištenje napomena @Before, koje se izvode prije svakog testnog slučaja

Korištenjem @Test(expected) , provjerit će navedenu iznimku tijekom svog izvođenja

Korištenje @After, izvršava se nakon svakog testa

Korištenje @AfterClass, izvršava se nakon svih testnih slučajeva

JUnit Potvrdi klasu

Anotacije odlučuju kada se metoda izvršava; assert metode odlučuju hoće li proći.

Ova klasa pruža niz metoda assertacije korisnih za pisanje testnog slučaja. Ako su sve assert naredbe uspješne, rezultati testa su uspješni. Ako bilo koja assert naredba ne uspije, rezultati testa su neuspješni. Namjenska JUnit tvrditi tutorijal detaljno pokriva svaku metodu.

Kao što ste ranije vidjeli, donja tablica opisuje važne Assert metode i njihov opis:

S.No. način Description
1. void assertEquals(booleov očekivano, booleov stvarni) Provjerava jesu li dvije vrijednosti jednake, slično metodi equals klase Object.
2. void assertFalse (booleov uvjet) Funkcionalnost je provjeriti je li uvjet lažan.
3. void assertNotNull(Object object) Funkcija "assertNotNull" služi za provjeru da objekt nije null.
4. void assertNull(Object objekt) Funkcija “assertNull” je provjera je li objekt null.
5. void assertTrue(booleov uvjet) Funkcija “assertTrue” služi za provjeru je li uvjet istinit.
6. void fail() Ako želite izbaciti grešku tvrdnje, fail() uvijek rezultira presudom neuspjeh.
7. void assertSame([String poruka] Funkcija "assertSame" služi za provjeru odnose li se dva objekta na isti objekt.
8. void assertNotSame([String poruka] Funkcija "assertNotSame" služi za provjeru da se dva objekta ne odnose na isti objekt.

JUnit Razred testnih slučajeva

Za pokretanje više testova, klasa TestCase dostupna je u junit.framework paket. Anotacija @Test govori JUnit da se ova javna void metoda (ovdje testni slučaj) kojoj je pridružena može pokrenuti kao testni slučaj.

Napomena o verziji: TestCase, Rezultat testa i TestSuite pripadaju nasljeđu junit.framework paket od JUnit 3. I dalje se isporučuju unutar artefakta junit 4.x, ali testovi temeljeni na anotacijama ne proširuju TestCase.

Donja tablica prikazuje neke važne metode dostupne u junit.framework.TestCase razred:

S.No. način Description
1. int countTestCases() Ova metoda se koristi za brojanje koliko testnih slučajeva je izvršeno od strane pokrenuti (TestResult tr) metoda.
2. TestResult createResult() Ova se metoda koristi za stvaranje a Rezultat testa objekt.
3. Niz getName() Ova metoda vraća niz koji nije ništa drugo do a TestCase Naziv.
4. TestRezult run() Ova metoda se koristi za izvršavanje testa, koji vraća Rezultat testa objekt.
5. void run (TestResult rezultat) Ova se metoda koristi za izvođenje testa koji ima Rezultat testa objekt koji ne vraća ništa.
6. void setName(naziv niza) Ova metoda se koristi za postavljanje imena TestCase.
7. void SetUp() Ova se metoda koristi za pisanje koda za povezivanje resursa, na primjer za stvaranje veze s bazom podataka.
8. praznina tearDown() Ova se metoda koristi za pisanje koda za oslobađanje resursa, na primjer za oslobađanje veze s bazom podataka nakon izvođenja transakcijske operacije.

JUnit Klasa TestResult

Kada izvršite test, on vraća rezultat (u obliku Rezultat testa Ovaj objekt TestResult može se koristiti za analizu rezultirajućeg objekta. Rezultat testa može biti neuspješan ili uspješan.

Pogledajte donju tablicu za važne metode korištene u klasi junit.framework.TestResult:

S.No. način Description
1. void addError(Test test, Throwable t) Ova se metoda koristi ako je potrebno dodati pogrešku testu.
2. void addFailure(Test test, AssertionFailedError t) Ova se metoda koristi ako je potrebno dodati kvar na popis kvarova.
3. void endTest (Testni test) Ova se metoda koristi za obavještavanje da je test proveden (završen).
4. int errorCount() Ova metoda se koristi za otkrivanje grešaka tijekom izvođenja testa.
5. Nabrajanje pogreške() Ova metoda jednostavno vraća kolekciju (ovdje Enumeraciju) grešaka.
6. int errorCount() Ova metoda se koristi za dobivanje broja grešaka otkrivenih tijekom izvođenja testa.
7. void run (TestCase test) Ova se metoda koristi za izvođenje testnog slučaja.
8. int runCount() Ova metoda jednostavno broji izvršene testove.
9. void startTest(Testni test) Ova se metoda koristi za obavještavanje da je test započeo.
10. void stop() Ova se metoda koristi za zaustavljanje probnog rada.

JUnit Klasa paketa testova

Ako želite izvršiti više testova određenim redoslijedom, to možete učiniti kombiniranjem svih testova na jednom mjestu. To mjesto naziva se skup testova, a JUnit testni paket tutorijal vodi kroz cijeli primjer.

Pogledajte donju tablicu za važne metode koje se koriste u junit.framework.TestSuite razred:

S.No. način Description
1. void addTest(Testni test) Ova se metoda koristi ako želite dodati test u paket.
2. void addTestSuite(Klasa testClass) Ova se metoda koristi ako želite navesti klasu dok dodajete test u paket.
3. int countTestCases() Ova se metoda koristi ako želite izbrojati testne slučajeve.
4. Niz getName() Ova se metoda koristi za dobivanje imena paketa testova.
5. void run (TestResult rezultat) Ova metoda se koristi za izvršavanje testa i prikupljanje rezultata testa u Rezultat testa objekt.
6. void setName(naziv niza) Ova metoda se koristi za postavljanje imena TestSuite.
7. Testiraj testAt(int indeks) Ova se metoda koristi ako želite vratiti test na zadanom indeksu.
8. int testCount() Ova metoda se koristi ako želite vratiti broj testova u paketu.
9. upozorenje o statičkom testu (poruka niza) Ova metoda vraća test koji neće uspjeti i bilježi poruku upozorenja.

Pitanja i odgovori

Da. Metoda obično nosi @Test zajedno s @Ignore ili @Test s vremenskim ograničenjem i očekivanom iznimkom. Ne možete slagati dvije anotacije životnog ciklusa, kao što su @Before i @After, na jednoj metodi.

@Ignore samo potiskuje metodu JUnit već prepoznaje kao test. Bez @Test pored njega, trkač nikada ne prikuplja metodu, pa se ona ne izvršava niti je navedena kao preskočena.

JUnit pokreće metodu u zasebnoj niti i uzrokuje prekid s iznimkom TestTimedOutException nakon isteka proračuna. Nit se prekida, a ne završava, pa se blokirajući poziv može nastaviti izvršavati.

Samo putem vintage engine-a. Dodavanje junit-vintage-engine-a omogućuje JUnit Platforma pokreće postojeće org.junit testove nepromijenjene, ali Jupiter testovi moraju uvesti org.junit.jupiter.api. Miješanje oba seta za uvoz u jednoj klasi ne uspijeva.

Samo za održavanje. Stariji paketi koji proširuju TestCase i grade TestSuite objekte i dalje su uobičajeni u starijim kodnim bazama, stoga prepoznavanje API-ja pomaže. Novi testovi trebali bi biti temeljeni na anotacijama.

JUnit gradi novu instancu testne klase za svaku testnu metodu, tako da nijedna ne postoji kada se mora pokrenuti postavljanje na razini klase. Statička metoda ne treba instancu i JUnit odbacuje nestatičku deklaraciju.

AI asistenti čitaju testiranu metodu i predlažu pripada li postavka u @Before ili @BeforeClass te treba li put kvara @Test(očekivano) ili assertThrows. Svaki prijedlog tretirajte kao nacrt.

GitHub kopilot obično ispravno postavlja i rastavlja, ali često se miješa JUnit 4 i Jupiter uvoze u jednoj datoteci. Provjerite blok uvoza prije pokretanja paketa.

Sažmite ovu objavu uz: