Git :)

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4. 스프링부트 퀵 스타트
    IT 서적/스프링부트 퀵 스타트 2023. 10. 22. 14:37

    테스트와 로깅, 빌드

    • 개발자들은 누구나 자신이 작성한 코드에 문제가 없음을 검증하기 위해 어떤 방법으로든 테스트 코드를 작성한다.
    • 대부분의 프로젝트에서는 JUnit을 기반으로 일관성 있는 단위 테스트를 진행하는데, 단위 테스트란 자신이 작성한 클레스에 대한 테스트로서 테스트 단계 중에서 가장 기본이라고 할 수 있다.

    우선 아래와 같은 의존성을 생성한다.

    	<dependency>
       	<groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</<artifactId>
           <scope>test</scope>
       </dependency>

    또한, 아래와 같은 테스트를 위한 클레스를 생성한다.

    package com.rubypaper;
    
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.core.env.Environment;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    class Chapter03ApplicationTests {
    
    	@Autowired
    	Environment environment ;
    	
    	@Test
    	void contextLoads() {
    		System.out.println(environment.getProperty("author.name"));
    		
    	}
    
    }
    • 먼저 클레스 선언부에 @RunWith가 추가되어 있는데, 이는 JUnit에서 기본적으로 제공하는 러너가 아닌 스프링 러너를 사용하기 위해서 추가한 것이다.
    • 그리고 두번째로 SpringBootTest 어노테이션을 추가했는데, 이는 메인 클래스에 선언된 @SpringBootApplication과 비슷한 어노테이션이라고 생각하면 된다.
    • SpringBootApplication이 사용자가 작성한 빈과 자동설정 빈들을 모두 초기화하듯이 @SpringBootTest 역시 테스트 케이스가 실행될 때 테스트에 필요한 모든 설정과 빈들을 자동으로 초기화하는 역할을 수행한다.

    아래와 같이 Environment 클레스를 사용하면 application.properties에 있는 프라퍼티를 사용할 수 있다.

    package com.rubypaper;
    
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    //import org.junit.runner.RunWith;
    //import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.core.env.Environment;
    
    import com.rubypaper.controller.BoardController;
    
    //@RunWith(SpringRunner.class)
    @SpringBootTest(classes=BoardController.class)
    
    public class PropertiesTest {
    	
    	@Autowired
    	Environment environment ;
    	
    	@Test
    	public void testMetod() {
    		System.out.println(environment.getProperty("author.name"));
    		System.out.println(environment.getProperty("author.age"));
    	}
    }
    • application.properties에 아래와 같은 프라퍼티가 설정돼 있음.

    MockMvc를 이용해서 컨트롤러 테스트 하기

    • 테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것을 모킹
    • 모킹한 객체를 메모리에서 얻어내는 과정을 목업(Mock-up)이라고 한다.
    • WebMvcTest는 @Controller와 @RestController가 설정된 클레스들을 찾아 메모리에 생성한다.
    • 반면 @Service나 @Repository가 붙은 객체들은 테스트 대상이 아닌 것으로 처리한다.
    • @WebMvcTest와 유사한 기능 중에는 @AutoConfigureMockMvc라는 것도 있다. 차이점은 @AutoConfigureMockMvc는 @Servicve, @Repository가 붙은 객체들도 모두 메모리에 적재한다.

     

    MockMvc의 사용법은 아래와 같다.
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    import com.rubypaper.controller.BoardController;
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(BoardController.class)
    public class BoarderController {
    
    @Autowired
      private MockMvc mockMvc;
    
    @Test
    public void testHello() throws Exception {
    	 mockMvc.perform(get("/hello") 
                .param("name", "둘리"))
                .andExpect(status().isOk())
                .andExpect(content().string("Mock 테스트"))  
                .andDo(print()); 
        }
    }