Spring & SpringBoot/Testing

@SpringBootTest, @AutoConfigureMockMvc 사용하여 API Flow 테스트 케이스 작성하기

Hyeonni 2022. 11. 10. 18:19

앞서 주로 비즈니스 클래스의 메서드들이 기능에 맞게 잘 동작하는지 확인하는 테스트인 단위 테스트를 위주로 공부했다. 하지만 API를 개발할 때 주로 Controller, Service, repository로 계층을 나누어 각각의 역할을 수행하도록 구현하기 때문에 각 계층별로 흐름이 잘 연결이 되는지 검증이 필요하다. 이번에는 전체적인 API의 흐름을 테스트하는 테스트 케이스를 작성해보자.

 

위의 코드는 이메일과 이름, 핸드폰 번호를 입력받아서 회원가입을 진행하는 API에 대한 Controller를 테스트하는 코드이다. 아래에서 하나하나 살펴보자.

 

먼저 위 코드처럼 테스트를 하기 위해서는 Cson이라는 객체를 Json으로 변환해주는 라이브러리를 추가해주어야 한다.

implementation 'com.google.code.gson:gson'

 

  • @SpringBootTest
    • Spring Boot 기반의 애플리케이션을 테스트하기 위한 Application Context를 생성한다.
  • @AutoConfigureMockMvc
    • Controller 테스트를 위한 애플리케이션의 자동 구성 작업을 해준다. 
    • Controller 뿐만 아니라 테스트 대상이 아닌 @Service나 @Repository가 붙은 객체들도 모두 메모리에 올린다.
      즉, 프로젝트 내의 스프링 빈을 모두 등록하여 테스트에 필요한 의존성을 추가한다.
    • MockMvc를 사용하기 위해서는 반드시 추가해주어야 한다.

위의 두 애너테이션을 사용하여 테스트를 진행하면 애플리케이션의 설정과 모든 Bean을 로드하기 때문에 실제 운영환경과 가장 유사한 테스트가 가능하지만 시간이 오래 걸린다.

 

  • MockMvc
    • Tomcat과 같은 서버를 실행하지 않고 Spring 기반 애플리케이션의 Controller를 테스트할 수 있는 환경을 제공해주는 Spring MVC 테스트 프레임워크이다.
    • perform(HTTP request에 대한 정보) : 인자로 Controller 호출을 위한 세부적인 정보들을 포함하여 테스트 대상 Controller의 핸들러 메서드에 요청을 전송한다.
      • 인자로 넘겨주는 HTTP request에 대한 정보는 MockMvcRequestBuilders 클래스를 이용해서 빌더 패턴을 통해 request 정보를 포함할 수 있다.
        • post(url) : HTTP POST METHOD와 request URL을 설정한다.
        • accept() : 클라이언트 쪽에서 리턴 받을 응답 데이터 타입을 설정한다.
        • contentType() : 서버 쪽에서 처리 가능한 Content type을 설정한다.
        • content() : request body 데이터를 설정한다.
      • return 값으로 ResultActions 타입의 객체를 리턴한다.
        • andExpect() : 파라미터로 입력한 Matcher로 예상되는 기대 결과를 검증할 수 있다.
        • status().isCreated() : response status 값을 가져와 201(Created)인지 확인한다.
        • jsonPath() : JSON 형식의 response body의 각 프로퍼티에 접근하여 값을 가져온다.
        • andReturn() : response 테이터를 확인할 수 있다.  

 

만약 테스트를 하는 과정에서 콘솔 출력에 response body로 전달된 JSON 데이터에서 한글이 깨져 보이면 application.yml에 아래 설정을 추가한다.

server:
  servlet:
    encoding:
      force-response: true

 

 


https://astrid-dm.tistory.com/536

 

추가 공부 자료:

MockMvc의 기능 알아보기

MockMvc의 request 수행 메서드 알아보기

MockMvcResultMatchers API Doc

JsonPathResultMatchers API Doc

JsonPath github