barded

[무물] 3-1. 통합테스트  MockMvc vs. WebTestClient vs. TestRestTemplate 본문

프로젝트/무물

[무물] 3-1. 통합테스트  MockMvc vs. WebTestClient vs. TestRestTemplate

barded 2024. 6. 6. 14:43

Spring은 컨트롤러 엔드포인트를 테스트하기 위한 다양한 도구를 제공한다. MockMvc, WebTest Client 및 TestRestTemplate. 세 후보 모두 HTTP 엔드포인트 호출 및 응답 확인이라는 유사한 목표를 수행하지만, 이들 사이에는 여전히 자막 차이가 있고, 어느것을 선택할지 살펴보자.

MockMvc

  • 용도: HTTP 서버를 시작하지 않고 Spring MVC 컨트롤러를 테스트할 때 이상적
  • 성능: 임베디드 서버가 필요하지 않아 빠르고 가볍습니다. 주로 단위 테스트에 적합.
  • 통합: Spring Security와 잘 연동되어 인증 및 권한 부여를 모킹할 수 있음.
  • 설정: @WebMvcTest와 함께 쉽게 설정할 수 있으며, 요청 빌딩 및 응답 검증을 위한 유창한 API를 제공

WebTestClient

  • 용도: 주로 리액티브 애플리케이션 테스트에 사용되지만, 전통적인 Spring MVC 컨트롤러에도 사용할 수 있음
  • 환경: @SpringBootTest와 WebEnvironment.RANDOM_PORT 또는 WebEnvironment.DEFINED_PORT와 함께 사용할 때 로컬 또는 임베디드 서버가 필요
  • 유연성: 특정 컨트롤러 또는 전체 애플리케이션 컨텍스트에 바인딩할 수 있어 통합 테스트와 단위 테스트 시나리오 모두에 사용할 수 있음
  • 기능: 요청 및 응답 어설션을 위한 유창한 API를 제공하며, 비차단 및 리액티브 애플리케이션에 적합

TestRestTemplate

  • 용도: 실제 HTTP 서버로 RESTful 웹 서비스를 통합 테스트할 때 가장 적합.
  • 환경: 전체 Spring Boot 애플리케이션 컨텍스트가 필요하며, 일반적으로 @SpringBootTest와 함께 사용됨
  • 편리성: HTTP 요청을 만들고 응답을 POJO로 변환하는 편리한 메서드를 제공하여 REST 엔드포인트 테스트 과정을 단순화함
  • 제한사항: MockMvc 및 WebTestClient에 비해 자세한 요청 및 응답 어설션에 덜 적합

결론

MockMvc: 실제 HTTP 통신 없이 모의 서블릿 환경과 상호 작용하는 유창한 API를 제공한다. 주로 Spring WebMVC 컨트롤러 엔드포인트를 검증하는 데 사용된다.

WebTestClient: 원래 Spring WebFlux 엔드포인트를 호출하고 검증하기 위한 도구로, 실행 중인 서블릿 컨테이너나 MockMvc를 테스트하는 데도 사용할 수 있다. 요청과 검증을 체인 방식으로 처리하는 유창한 API를 제공한다.

TestRestTemplate: 실행 중인 서블릿 컨테이너의 컨트롤러 엔드포인트를 HTTP를 통해 테스트하고 검증한다. 유창하지 않은 API를 제공하며, 주로 RestTemplate에 익숙한 팀이 사용한다.

따라서 @WebMvcTest를 하는 경우엔 MockMvc, 통합테스트를 위해선 @WebTestClient를 사용하자.

 

[무물] 1. 단위테스트 / 통합 테스트 란?

[무물] 2-1.계층별 단위테스트 - Repository

[무물] 2-2. 계층별 단위테스트 - Service

[무물] 2-3. 계층별 단위테스트 - Controller

[무물] 3-1. 통합테스트  MockMvc vs. WebTestClient vs. TestRestTemplate

[무물] 3-2. 통합테스트

[무물] 4. 단위 테스트 네이밍 컨벤션