728x90
반응형
SMALL

@SpringBootTest와 @WebMvcTest의 차이점을 설명해 주세요.

1. @SpringBootTest

  • 이 어노테이션은 통합 테스트를 수행할 때 사용된다.
  • @SpringBootTest 어노테이션을 사용하면 전체 Spring ApplicationContext를 로드한다.
  • 이는 모든 Bean들을 초기화하고 모든 구성을 로드한다는 것을 의미한다.
  • 따라서 애플리케이션의 전체 동작을 테스트하려는 경우에 사용된다.
  • 하지만 이는 상당한 시간과 자원을 필요로 한다.
@SpringBootTest
public class ApplicationTest {

    @Autowired
    private MyService myService;

    @Test
    public void contextLoads() {
        // 테스트 코드...
    }
}

2. @WebMvcTest

  • @WebMvcTest 어노테이션은 웹 계층만을 테스트하는 데 사용된다.
  • Spring MVC 인프라를 설정하고 웹 관련 빈들만 로드한다.
  • 컨트롤러, 컨트롤러 어드바이스, 필터, 인터셉터 등과 같은 웹 관련 구성만 로드한다는 것을 의미한다.
  • 이 어노테이션은 MockMvc 인스턴스를 자동으로 제공하여, HTTP 요청을 디스패처 서블릿에 보내고 그 결과를 검증할 수 있다.
  • **@WebMvcTest**는 빠른 피드백을 제공하며, 컨트롤러 단위 테스트를 하는 데 유용하다.
@WebMvcTest(MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testMyController() throws Exception {
        this.mockMvc.perform(get("/"))
            .andExpect(status().isOk())
            .andExpect(content().string("Hello World"));
    }
}

따라서, @SpringBootTest @WebMvcTest의 주요 차이점은 테스트의 범위와 로드하는 ApplicationContext의 범위에 있다. @SpringBootTest는 전체 ApplicationContext를 로드하고, @WebMvcTest는 웹 계층에 관련된 부분만 로드한다.

 


SpringBoot에서 JUnit을 사용하여 테스트 코드를 작성할 때

@SpringBootTest 어노테이션을 자주 쓰게 되는데, 상황에 따라서는 @WebMvcTest를 쓰는게 좋을 때도 있다.

@SpringBootTest @WebMvcTest는 둘 다 Spring Boot 테스트를 위한 어노테이션입니다. 하지만 두 어노테이션은 사용되는 컨텍스트와 테스트의 범위에 따라 크게 다릅니다.

Junit이란 자바 개발자의 93%가 사용하는 단위 테스트 프레임워크이며 Java8 이상부터 지원한다.

JUnit5의 경우 2017년 10월에 공개

스프링부트의 경우 2.2버전부터 기본적으로 제공된다.


@SpringBootTest + @AutoConfigureMockMvc

  • 프로젝트 내부에 있는 스프링 빈을 모두 등록하여 테스트에 필요한 의존성을 추가한다.
  • 실제 운영 환경에서 사용될 클래스들을 통합하여 테스트한다.
  • 단위 테스트와 같이 기능 검증을 위한 것이 아니라, Spring Framework에서 전체적으로 Flow가 제대로 동작하는지 검증하기 위해 사용한다.

장점

  • 애플리케이션의 설정, 모든 Bean을 모두 로드하기 때문에 운영환경과 가장 유사한 테스트가 가능하다.

단점

  • 테스트 단위가 크기에 디버깅이 까다로움
  • 어플리케이션의 설정, 모든 Bean을 로드하기 때문에 시간이 오래 걸림
@SpringBoottest
@AutoConfugurMockMvc
class SenderControllerTest {

	@Autowited
	private MockMvc mockMvc;

	@Autowited
	private ObjectMapper objectMapper;

	@MockBean
	private SenderService senderService;
}

 

@WebMvcTest

  • MVC를 위한 테스트, 컨드롤러가 예상대로 작동되는지 테스트하기 위해 사용된다.
  • Web Layer만 로드하며, @WebMvcTest어노테이션을 사용시 아래의 항목들만 스캔하도록 제한하여 보다 빠르고 가벼운 테스트가 가능하다.

장점

  • WebApllication과 관련된 Bean들만 등록하기 때문에 @SpringBootTest보다 빠르다.
  • 통합테스트를 진행하기 어려운 테스트를 개별적으로 진행 가능

단점

  • Mock을 기반으로 테스트하기 때문에, 실제 환경에서는 예상 밖의 동작오류가 발생할 수 있다.(참고: 위의 @SpringBootTest에는 @ExtendWith(SpringExtension.class)가 포함되어있음)
  • @WebMvcTest()의 프로퍼티로 테스트를 원하는 컨트롤러 클래스를 넣어준다.
@ExtendWith(SpringExtension.class)
@WebMvcTest(SenderController.class)
class SenderControllerTest {

	@Autowited
	private MockMvc mockMvc;

	@Autowited
	private ObjectMapper objectMapper;

	@MockBean
	private SenderService senderService;

	@MockBean
	private AraClient araClient;
}
728x90
반응형
LIST

+ Recent posts