본문 바로가기

내일배움캠프

TIL

@SpringBootTest는 Spring Boot에서 제공하는 애노테이션으로, 통합 테스트를 위해 사용됩니다. 이는 애플리케이션 컨텍스트를 실제 애플리케이션과 동일하게 부트스트랩하여 모든 빈, 설정 및 애스펙트를 포함한 전체 애플리케이션 컨텍스트를 테스트할 수 있게 해줍니다.

다음은 @SpringBootTest에 대한 주요 사항입니다:

  1. 애노테이션 사용법: 테스트 클래스에 @SpringBootTest를 추가하면 Spring Boot는 메인 설정 클래스(@SpringBootApplication이 붙은 클래스)를 찾아서 Spring 애플리케이션 컨텍스트를 시작합니다.
  2. 설정:
    • 기본적으로 @SpringBootTest는 전체 애플리케이션 컨텍스트를 시작합니다.
    • 특정 클래스나 설정을 지정하여 테스트 시 필요한 부분만 로드할 수 있습니다. 이를 통해 테스트 속도를 향상시킬 수 있습니다.
  3. 웹 환경:
    • @SpringBootTest는 웹 환경을 시작하도록 설정할 수 있습니다. 이는 웹 애플리케이션 테스트에 유용합니다.
    • webEnvironment 속성을 다음 값으로 설정할 수 있습니다:
      • WebEnvironment.MOCK: 모의 서블릿 환경을 로드합니다 (기본값).
      • WebEnvironment.RANDOM_PORT: 실질적인 서블릿 환경을 무작위 포트로 로드합니다.
      • WebEnvironment.DEFINED_PORT: 정의된 포트로 실질적인 서블릿 환경을 로드합니다.
      • WebEnvironment.NONE: 웹 환경 없이 애플리케이션 컨텍스트를 로드합니다.
  4. 예제:
     
  5. 장점:
    • 포괄적인 테스트: 전체 Spring Boot 애플리케이션 컨텍스트를 테스트할 수 있습니다.
    • 현실적인 환경: 실제 애플리케이션이 실행될 환경과 유사한 시나리오를 시뮬레이션할 수 있습니다.
  6. 단점:
    • 성능: 전체 컨텍스트를 시작하기 때문에 단위 테스트에 비해 속도가 느릴 수 있습니다.
    • 복잡성: 단순한 단위 테스트에 비해 설정 및 관리가 복잡할 수 있습니다.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.web.client.TestRestTemplate;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyApplicationTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void contextLoads() {
        // 여기서 통합 테스트 수행
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).isEqualTo("Hello, World!");
    }
}

@SpringBootTest는 애플리케이션의 실제 사용 시나리오와 유사한 통합 테스트를 작성할 수 있게 해주는 강력한 도구입니다.

 

@WebMvcTest는 Spring Boot에서 제공하는 애노테이션으로, 웹 계층(Web Layer) 테스트를 위한 것입니다. 주로 Spring MVC 컨트롤러를 테스트하는 데 사용되며, 전체 애플리케이션 컨텍스트를 로드하지 않고 웹 관련 빈만 로드하기 때문에 테스트 속도가 빠르고 집중적입니다.

다음은 @WebMvcTest에 대한 주요 사항입니다:

  1. 애노테이션 사용법: @WebMvcTest는 주로 특정 컨트롤러 클래스를 테스트할 때 사용됩니다. 애노테이션에 테스트할 컨트롤러 클래스를 지정합니다.
  2. 예제:
  3. java
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.boot.test.mock.mockito.MockBean;
    import org.springframework.test.web.servlet.MockMvc;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    @WebMvcTest(MyController.class)
    public class MyControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @MockBean
        private MyService myService;
    
        @Test
        public void shouldReturnDefaultMessage() throws Exception {
            mockMvc.perform(get("/"))
                    .andExpect(status().isOk())
                    .andExpect(content().string("Hello, World!"));
        }
    }
  4. 주요 기능:
    • MockMvc: MockMvc 빈을 자동으로 구성하여 HTTP 요청을 모의하고 응답을 검증할 수 있습니다.
    • 특정 컨트롤러 테스트: 애노테이션에 특정 컨트롤러 클래스를 지정하면 해당 컨트롤러와 관련된 빈만 로드하여 테스트를 수행합니다.
    • 간편한 서비스 모킹: @MockBean을 사용하여 서비스 계층을 모킹(Mocking)할 수 있습니다. 이를 통해 서비스 로직을 실제로 호출하지 않고도 컨트롤러 로직을 테스트할 수 있습니다.
  5. 장점:
    • 빠른 테스트: 전체 애플리케이션 컨텍스트를 로드하지 않기 때문에 테스트 속도가 빠릅니다.
    • 집중적인 테스트: 특정 컨트롤러 및 웹 관련 로직에 집중하여 테스트를 수행할 수 있습니다.
  6. 단점:
    • 제한된 컨텍스트: 웹 계층만 테스트하기 때문에 서비스 계층이나 리포지토리 계층을 포함한 통합 테스트에는 적합하지 않습니다.

@WebMvcTest는 컨트롤러 로직을 빠르고 집중적으로 테스트하는 데 유용하며, 주로 단위 테스트와 통합 테스트 사이의 영역을 커버하는 역할을 합니다. 이를 통해 HTTP 요청 및 응답의 검증, 컨트롤러의 작동 여부 등을 효과적으로 확인할 수 있습니다.

'내일배움캠프' 카테고리의 다른 글

TIL  (0) 2024.06.19
TIL  (0) 2024.06.19
TIL  (0) 2024.06.14
TIL  (0) 2024.06.14
TIL 34일차?  (0) 2024.06.07