JUnit muhitini sozlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

3.1 @BeforeEach, @AfterEach annotatsiyalar

Oldingi misolda har bir metodda Calculator obyektini yaratish uchun kod yozishimiz kerak edi.

Bu faqat bir qator, lekin haqiqiy tizimlarni test qilsak, ko'pincha bir necha obyektni yaratish va sozlash kerak bo'ladi, bu esa bir necha o'n qator kodni egallashi mumkin. Misol:


   //HttpClient obyektini yaratamiz
   HttpClient client = HttpClient.newBuilder()
    	.version(Version.HTTP_1_1)
    	.followRedirects(Redirect.NORMAL)
        .connectTimeout(Duration.ofSeconds(20))
    	.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
        .authenticator(Authenticator.getDefault())
    	.build();
 
   //HttpRequest obyektini yaratamiz
  HttpRequest request = HttpRequest.newBuilder()
     .uri(new URI("https://javarush.com"))
     .headers("Content-Type", " application/octet-stream")
     .POST( HttpRequest.BodyPublishers. ofInputStream ( () -> is; ))
     .build();
 
   //send() metodini chaqiramiz
   HttpResponse
      
  
      
  
    response = client.send(request, BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.body()); 
  

Yuqoridagi misolda biz HttpClient obyektini yaratdik va send() metodini test qilmoqchimiz.

Har safar test metodida HttpClient obyektini yaratishni yozmaslik uchun uni alohida metodga ajratib, maxsus annotatsiyaga @BeforeEach belgilashimiz mumkin. Junit bu metodni har bir test metodidan oldin chaqiradi. Misol:


    class HttpClientTest {
     	public HttpClient client;
 
   	@BeforeEach
    	public void init(){
   	   client = HttpClient.newBuilder()
   	        .version(Version.HTTP_1_1)
   	        .followRedirects(Redirect.NORMAL)
   	        .connectTimeout(Duration.ofSeconds(20))
   	        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
   	        .authenticator(Authenticator.getDefault())
   	        .build();
    	}
 
   	@Test
    	public void send200() throws Exception {
     	   //HttpRequst() obyektini yaratamiz
         	HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com")).build();
 
     	   //send() metodini chaqiramiz
     	   HttpResponse
      
  
      
  
    response = client.send(request, BodyHandlers.ofString()); assertEquals(200, response.statusCode()); } @Test public void send404() throws Exception { //HttpRequst() obyektini yaratamiz HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com/unknown")).build(); //send() metodini chaqiramiz HttpResponse 
   
     response = client.send(request, BodyHandlers.ofString()); assertEquals(404, response.statusCode()); } } 
    
  

Bundan tashqari, har bir test metodidan keyin chaqiriladigan maxsus metod yaratish mumkin va foydalanilgan resurslarni tozalash, logga yozish va hokazo. Bunday metodni @AfterEach annotatsiyasi bilan belgilash kerak.

Agar sizda 3 ta test metodlari test1(), test2() va test3() bo'lsa, chaqirilish tartibi quyidagicha bo'ladi:

  • BeforeEach-metod
  • test1()
  • AfterEach-metod
  • BeforeEach-metod
  • test2()
  • AfterEach-metod
  • BeforeEach-metod
  • test3()
  • AfterEach-metod

3.2 @BeforeAll, @AfterAll annotatsiyalar

JUnit test metodlaridan oldin bir marta chaqiriladigan metod qo'shishga imkon beradi. Bunday metodni @BeforeAll annotatsiyasi bilan belgilash kerak. Uning uchun @AfterAll parallel annotatsiyasi mavjud. Bu bilan belgilangan metod test metodlaridan keyin JUnit tomonidan chaqiriladi.

Buning qanday ishlashini yaxshiroq tushunish uchun maxsus misol yozamiz. Calculator'imizni test qilishni asos qilib olamiz:


class CalculatorTest {
    private Calculator calc = new Calculator();

    @BeforeAll
    public static void init(){
        System.out.println("BeforeAll init() method called");
    }
 
    @BeforeEach
    public void initEach(){
        System.out.println("BeforeEach initEach() method called");
    }
 
    @Test
    public void add(){
        System.out.println("Qo'shish test qilinmoqda");
    }
 
    @Test
    public void sub() {
        System.out.println("Ayirma test qilinmoqda");
    }
 
    @Test
    public void mul(){
        System.out.println("Ko'paytirish test qilinmoqda");
    }
 
    @Test
    public void div() {
        System.out.println("Bo'lish test qilinmoqda");
    }
}

Bu test konsolda quyidagi matnni chop etadi:


BeforeAll init() method called
BeforeEach initEach() method called
Qo'shish test qilinmoqda
 
BeforeEach initEach() method called
Ayirma test qilinmoqda
 
BeforeEach initEach() method called
Ko'paytirish test qilinmoqda
 
BeforeEach initEach() method called
Bo'lish test qilinmoqda
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION