[ATDD] RestAssured
간단하게 ATDD에 대한 개념만 지난 글에서 잠깐 다루었습니다.
이번에는 ATDD 를 하기 위한 테스트 도구를 소개하고자 합니다.
1. RestAssured
REST 어플리케이션의 HTTP Endpoint 에 초점을 맞춘 테스트 도구.
RestAssured 를 본격적으로 소개하기 전에 먼저 인수 테스트는 블랙박스 테스트의 성격을 가지고 있고,
내부의 코드를 직접 호출하지 않고 외부에서만 요청하여 검증하는 것이 좋습니다.
예를 들어, 고객이 상품을 구매한다는 액션을 할 때, 상품의 재고를 확인하고 할인율을 적용하고 고객의 등급을 확인하고
이런 여러가지의 내부로직이 동작한다고 해봅시다.
그렇다면 인수 테스트로 검증하는 것은 "고객이 상품을 구매한다" → "상품 구매 성공" 이 시나리오를 검증하는것 입니다.
그러면 이것을 테스트하기 위한 도구들을 적절히 사용하여 고객의 시나리오를 검증해봅시다.
RestAssured 는 엔드포인트에 초점을 맞춘 테스트 도구입니다. 컨트롤러의 로직을 호출하여 서비스단 등 다른 계층의
로직을 한번에 테스트 할 수 있는 장점이 있습니다.
2. RestAssured VS MockMvc
MockMvc 는 @SpringBootTest 의 webEnvironment.MOCK 과 함께 사용 가능하며 moking 된 web environment 환경에서 테스트합니다. 또한 MockMvc는 @SpringBootTest 를 사용하지 않고, @WebMvcTest 를 통해 Presentation Layer Bean 들만 불러올 수 있습니다. 그 외 Bean들은 Mock 객체 설정을 해주어 순수한 Controller 의 로직을 테스트 할 수 있습니다.
이는 테스트하고자 하는 객체와 계층을 분리시킬 수 있다는 뜻입니다.
RestAssured 는 실제 web environment 를 사용하여 테스트합니다. @SpringBootTest 로 실제 요청을 보내서 전체적인 로직을 테스트합니다.
3. RestAssured 사용
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class AcceptanceTest {
@LocalServerPort
public int port;
@BeforeEach
void setUp() {
RestAssured.port = port;
}
...
}
@DisplayName("상품 생성 테스트")
void create_test() {
// given
Map<String, String> params = new HashMap<>();
params.put("", "");
// when
ExtractableResponse<Response> response = RestAssured
.given().log().all()
.body(params)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.when().post("/product")
.then().log().all().extract();
// then
assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value());
}
위와 같은 문법으로 사용을 합니다. given, when, then 패턴을 이용하여 코드를 작성합니다.
포트에 관한 설정은 예제들을 더 만들어가며 소개를 하겠습니다.