BackEnd/개발방법론

[ATDD] RestAssured

JJangGu 2022. 3. 20. 01:26

간단하게 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 패턴을 이용하여 코드를 작성합니다.

포트에 관한 설정은 예제들을 더 만들어가며 소개를 하겠습니다.