카테고리 없음
Springboot 의 통합 테스팅 툴, RestAssured
개발자만타
2024. 1. 1. 17:41
RestAssured 는 Springboot REST API 를 Java 코드로 검증하는 테스팅 도구입니다. 함수형 프로그래밍 방식(Method Chaining) 으로 동작하며, given / when / then 으로 나누어 테스트를 수행할 수 있다는 특징이 있습니다.
아래와 같은 방식으로 사용할 수 있습니다.
- given : 어떤 HTTP 입력 내용을 넣어줄 지에 대한 부분을 결정하는 부분입니다. header 내용, query string, path variable 내용, body 내용을 따로 설정해 줄 수 있습니다.
- body 의 경우, Java Object 형태( ex : LoginUserRequest 타입의 객체 ) 로 만들어 집어넣으면 JSON 형식으로 자동으로 바뀌어 들어가게 됩니다.
- query string, path variable, 일반적인 header 내용의 경우, 각 method 에 넣어 method chaining 방식으로 이어 주어, HTTP Message 를 REST API 에 보낼 수 있습니다.
- when : get, post, put, patch, delete 중 하나의 method 방식으로 REST API 에 메세지를 보냅니다.
- then : 받아온 결과 Message 를 검증하는 파트입니다.
- 여기서 모든 내용을 검증할 수도 있지만, log().all().extract() 를 통해 객체 방식으로 결과물을 꺼내올 수도 있습니다.
- extract() 를 통해 객체 내용을 뽑아온다면, JUnit5 assertj 의 assertThat() 메소드를 통해 body 의 내용물을 상세하게 검증할 수 있습니다.
MockMVC vs RestAssured
MockMVC 방식으로도 Springboot 통합 테스트를 진행할 수 있습니다. 아래의 코드처럼 동작시킬 수 있습니다.
@SpringBootTest
@AutoConfigureMockMvc
public class YourApiIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testApiEndpoint() throws Exception {
mockMvc.perform(get("/api/endpoint"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.key").value("expectedValue"));
}
}
ChatGPT 가 말한 MockMVC vs RestAssured
MockMvc
장점:
Spring 통합: MockMvc는 Spring MVC와 긴밀하게 통합되어 있어, Spring 애플리케이션 컨텍스트와 함께 원활하게 작동합니다. Spring Boot 테스트 환경과의 연동이 용이합니다.
서버 없는 테스트: MockMvc는 실제 네트워크를 통하지 않고 서블릿 컨테이너를 모의(Mock)하므로 별도의 실행 서버 없이 빠르게 테스트를 수행할 수 있습니다.
상세한 요청/응답 검증: HTTP 요청 및 응답에 대해 상세한 검증이 가능합니다. 헤더, 상태 코드, 본문 내용 등을 정교하게 테스트할 수 있습니다.
단점:
복잡성: MockMvc를 사용한 테스트 코드는 때때로 복잡하고 장황해질 수 있습니다. 이는 가독성을 저하시킬 수 있습니다.
네트워크 레벨 테스트 부재: 실제 네트워크를 거치지 않기 때문에, 네트워크 레벨의 문제는 감지하지 못합니다.
RestAssured
장점:
간결함과 가독성: RestAssured는 간결하고 이해하기 쉬운 문법을 제공합니다. 이는 테스트 코드의 가독성과 작성 속도를 높여줍니다.
실제 HTTP 호출: RestAssured는 실제 HTTP 요청을 서버에 보내 테스트를 수행합니다. 이는 네트워크 레벨의 문제를 포착할 수 있게 해줍니다.
다양한 HTTP 메소드 지원: GET, POST, PUT, DELETE 등 다양한 HTTP 메소드를 쉽게 테스트할 수 있습니다.
JSON, XML 지원: JSON 및 XML 응답에 대한 테스트가 용이합니다.
단점:
실제 서버 필요: 테스트를 수행하기 위해 실제 실행 중인 서버가 필요합니다. 이는 테스트 환경을 설정하는 데 추가 작업이 필요할 수 있습니다.
Spring 통합이 덜 된다: MockMvc에 비해 Spring Boot와의 통합이 상대적으로 덜 강력합니다. 따라서 Spring 특유의 기능을 깊게 테스트하는 데는 제한이 있을 수 있습니다.
개인적으로 생각하는 RestAssured 의 장단점
- 확실히 MockMVC 보다 좀 느릴 수 있겠다는 생각이 많이 들었습니다. 테스트 실행 시, REST API 를 실행시킬 때의 시간이 걸립니다.
- given - when - then 으로 이어지는 로직 전개가 간결하고 매력적입니다. 그리고, 오랜만에 볼 때도 바로 내용을 알아보기 쉽습니다.
- Swagger + REST Docs 를 통합해서 Swagger Docs 를 만들 수 있습니다. 이러한 방식으로 Swagger Docs 를 생성하는 경우, Controller, DTO, Service 등 많은 부분을 Swagger 에 독립적으로 생성하고 관리할 수 있습니다.
- 위의 방식을 통하지 않고 Swagger 를 적용하는 경우, DTO, Service 를 POJO(Plain Old Java Object) 방식으로 관리하기 힘들어집니다. 코드의 유지보수성을 떨어뜨리는 원인이 될 수 있다고 생각합니다.
Swagger + Spring REST Docs + RestAssured 를 활용하는 예시
- filter 파트에서 Spring REST Docs 에 어떤 내용이 들어갈지 설정합니다.
- 이후, given - when - then 방식으로 기본적인 테스트 내용을 작성합니다. 여기서 기본적인 결과 상태 코드를 확인할 수 있습니다.
- 이후, extract() 이후 jsonPath 로 변환하면 HTTP Response Body 를 검증할 수 있게 됩니다.
- jsonPath.getString(), getInt(), getLong() 등을 통해, 원하는 JSON 경로에 있는 내용을 추출합니다.
- 이후, AssertJ 의 assertThat() 을 통해 마저 검증할 수 있습니다.