본문 바로가기

Spring 에서 Test 하는 방법

 

스프링 프레임워크를 테스트 할때 스프링의 `ApplicationContext` 전체를 불러와서 테스트 하는 방법과 특정 레이어만 불러와서 테스트하는 방법이 있다. 전체 테스트는 프로젝트의 크기가 커지면 테스트 속도가 느려지기 때문에 통합테스트가 아닐때는 불필요하다. 유닛테스트를 할때는 특정 레이어만 테스트하는게 좋은 방법이다.

 

  특정 레이어를 테스트할때는 레이어에 해당하는 빈만 들고오기 때문에 의존관계에 있는 다른레이어는 `Mock`을 이용해서 테스트를 해야한다. 기본적으로 통합테스트를 할때는 `@SpringBootTest` 애노테이션을 붙여서 테스트를 진행하면된다. 반면, 원하는 레이어만 테스트 할때는 `@MockMvcTest` 와 같이 특정 레이어를 테스트하기 위한 애노테이션을 태깅시켜야 한다.

 

  스프링에서 테스트 하는 방법에 대한 코드는 아래 링크에서 확인할 수 있다.

 

 

 

Mock테스트, RestTemplate, WebClient테스트 추가 · syunyun/spring-boot@2562e63

Permalink Browse files Mock테스트, RestTemplate, WebClient테스트 추가 Loading branch information Showing 6 changed files with 170 additions and 1 deletion. +13 −1 README.md +4 −0 pom.xml +18 −0 src/main/java/com/example/demo/SpringTest/Sample

github.com

 

 

레이어별 테스트 · syunyun/spring-boot@544b2ce

Permalink Browse files 레이어별 테스트 Loading branch information Showing 2 changed files with 42 additions and 0 deletions. +2 −0 src/test/java/com/example/demo/SpringTest/SampleControllerTest2.java +40 −0 src/test/java/com/example/demo/SpringT

github.com

 

 

 

컨트롤러 테스트가 필요한가?

 

  서비스레이어에 대해서 테스트를 통과하면 컨트롤러 테스트가 꼭 필요한가? 에 대해서 의문이 생길 수 있다. MSA 구조에서 여러 팀이 서로 다른 서비스를 관리하기 때문에 API의 변경이 치명적인 장애를 발생시킬 수 있다. 따라서 컨트롤러에 대한 테스트가 중요하다. 컨트롤러에 대한 단위 테스트가 통과되면 비즈니스 로직이 변경되거나 코드를 리팩토링 하더라도 실제 응답에 변화가 생기지 않았음을 보장할 수 있다. (만약 변화가 생겼다면 테스트는 깨지게 되고 변경사항을 다른팀에게 전달하거나 응답에 변화가 생기지 않도록 코드를 새로짜야 한다.)

 

 

컨트롤러 테스트를 하는 방법

 

 

  컨트롤러를 테스트하는것은 유닛테스트라고 할 수 있다. 컨트롤러에 요청을 보내고 요청에 대한 응답이 잘 오는지 확인만하면 되는 테스트이다. 이때 컨트롤러를 테스트하는 방법은 @WebMvcTest를 사용하는 방법과 @SpingBootTest를 사용하는방법이 있다.

 

@WebMvcTest는 서버에서 컨트롤러만 테스트할 때 사용하는 애노테이션
@SpringBootTest는 클라이언트로부터 상호작용을 확인하는 통합테스트에 적합하다. (Mock객체를 사용할 수 있지만 간단한 컨트롤러 테스트에는 적합하지 않다)

 

 

  근본적으로 둘의 차이는 얼마나 많은 설정과 컨텍스트를 불러오느냐에 있다. @SpringBootTest는 웹 애플리케이션 컨텍스트와 설정을 모두 불러와 실제 웹 서버에 연결을 시도한다. 이 경우에 테스트를 위해서는 RestTemplate을 이용하면 된다.

 

  반면 @MockMvcTest는 웹애플리케이션 컨텍스트를 초기화 하지만 모든 설정을 불러오는 것이 아니라 MVC레이어와 관련된 설정만 불러온다. HTTP 요청은 mock을 이용해 가짜로 이뤄지고 실제 연결은 생성되지 않는다.

 

 

참고

 

 

Testing the Web Layer

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

 

'Spring & Spring Boot' 카테고리의 다른 글

Feign Client  (0) 2020.10.08
스프링 - 비동기 처리 @async  (0) 2020.08.16
RequestContextHolder  (0) 2020.06.29
스프링 웹 프로그래밍 (2)  (0) 2020.02.22
스프링 웹 프로그래밍 (1)  (0) 2020.02.22

댓글