CodeGym /Kursy /All lectures for PL purposes /Konfigurowanie środowiska testowego w JUnit

Konfigurowanie środowiska testowego w JUnit

All lectures for PL purposes
Poziom 1 , Lekcja 398
Dostępny

3.1 Adnotacje @BeforeEach, @AfterEach

Zauważ, że w poprzednim przykładzie w każdej metodzie musieliśmy napisać kod, aby utworzyć obiektkalkulator.

Oczywiście to tylko jedna linijka, ale jeśli testujemy prawdziwe systemy, często będziemy mieli sytuację, w której trzeba stworzyć i skonfigurować kilka obiektów, co może zająć kilkadziesiąt linijek kodu. Przykład:

//Create an HttpClient object
   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();

   //Create an HttpRequest object
  HttpRequest request = HttpRequest.newBuilder()
     .uri(new URI("https://codegym.cc"))
     .headers("Content-Type", " application/octet-stream")
     .POST( HttpRequest.BodyPublishers. ofInputStream ( () -> is; ))
     .build();

   //Call the send() method
   HttpResponse
      
  
    response 
   = client 
   . 
   send 
   (request 
   , 
   BodyHandlers 
   . 
   ofString 
   ( 
   ) 
   ) 
   ; 
   System 
   .out 
   . 
   println 
   (response 
   . 
   statusCode 
   ( 
   ) 
   ) 
   ; 
   System 
   .out 
   . 
   println 
   (response 
   . 
   body 
   ( 
   ) 
   ) 
   ; 
  

W powyższym przykładzie stworzyliśmy i skonfigurowaliśmy obiektHttpClienti chcesz przetestować metodę send() .

Aby za każdym razem w metodzie testowej nie pisać tworzenia obiektuHttpClient, można ją przenieść do osobnej metody i nadać jej specjalną adnotację @BeforeEach . Następnie Junit wywoła tę metodę przed każdą metodą testową. Przykład:

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 {
     	   //Create an HttpRequest() object
         	HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();

     	   //Call the send() method
     	   HttpResponse
      
  
    response 
   = client 
   . 
   send 
   (request 
   , 
   BodyHandlers 
   . 
   ofString 
   ( 
   ) 
   ) 
   ; 
   assertEquals 
   ( 
   200 
   , response 
   . 
   statusCode 
   ( 
   ) 
   ) 
   ; 
   } 
   @Test 
   public 
   void 
   send404 
   ( 
   ) 
   throws 
   Exception 
   { 
   //Create an HttpRequest() object 
   HttpRequest request 
   = 
   HttpRequest 
   . 
   newBuilder 
   ( 
   new 
   URI 
   ( 
   "https://codegym.cc/unknown" 
   ) 
   ) 
   . 
   build 
   ( 
   ) 
   ; 
   //Call the send() method 
   HttpResponse 
   
     response 
    = client 
    . 
    send 
    (request 
    , 
    BodyHandlers 
    . 
    ofString 
    ( 
    ) 
    ) 
    ; 
    assertEquals 
    ( 
    404 
    , response 
    . 
    statusCode 
    ( 
    ) 
    ) 
    ; 
    } 
    } 
    
  

Można też stworzyć specjalną metodę, która będzie wywoływana każdorazowo po kolejnej metodzie testowej, a także wyczyścić wykorzystane zasoby , wpisać coś do logu itp. Taka metoda musi być oznaczona adnotacją @AfterEach .

Jeśli masz 3 metody testowe test1() , test2() i test3() , to kolejność połączeń będzie następująca:

  • przed każdą metodą
  • test1()
  • Metoda AfterEach
  • przed każdą metodą
  • test2()
  • Metoda AfterEach
  • przed każdą metodą
  • test3()
  • Metoda AfterEach

3.2 Adnotacje @BeforeAll, @AfterAll

JUnit pozwala również dodać metodę, która zostanie wywołana raz przed wszystkimi metodami testowymi . Taka metoda powinna być opatrzona adnotacją @BeforeAll . Ma również sparowaną adnotację @AfterAll . Metoda oznaczona nim zostanie wywołana przez JUnit po wszystkich metodach testowych.

Napiszmy specjalny przykład, który pozwoli ci lepiej zrozumieć, jak to wszystko działa. Weźmy jako podstawę testowanie naszego kalkulatora:

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

    @Test
    public void sub() {
        System.out.println("Testing Subtraction");
    }

    @Test
    public void mul(){
        System.out.println("Testing Multiplication");
    }

    @Test
    public void div() {
        System.out.println("Testing Division");
    }
}

Ten test spowoduje wydrukowanie następującego tekstu w konsoli:


BeforeAll init() method called
BeforeEach initEach() method called
Testing Addition
 
BeforeEach initEach() method called
Testing Subtraction
 
BeforeEach initEach() method called
Testing Multiplication
 
BeforeEach initEach() method called
Testing Division
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION