NEXT STEP/ATDD, 클린 코드 with Spring 5기

[ATDD] 인수 테스트 만들기

샤아이인 2022. 7. 8.

 

우선 인스테스트를 만들기 전, 인수 테스트를 블랙 박스 테스트의 성격을 가지고 있다는점을 알아두자.

내부의 동작을 모르는 상태에서 결과만 테스트 하는 것을 블랙 박스 테스트 라고 말한다.

 

테스트에서는 Production code에 의존하지 않는다.

요청을 통해 기능을 검증하도록 노력하고, 직접 요청을 통해서 초기화 데이터도 만든다.

 

▶ RestAssured 사용이유

Client 로는 RestAssured 객체를 사용하게 된다.

이는 Client가 Server에 요청을 보내듯, test 환경에서 test 메서드 안에서 Client 역할을 해준다.

 

1. 인수 테스트 만들기

크게 3가지 로 진행된다.

1) 인수 조건 작성

2) 인수 테스트 작성

3) 기능 구현

 

우리는 지하철 역을 만든다고 생각해보자.

 

1-1) 인수 조건 작성

1) 지하철 역 생성 요청을 한다.

2) 지하철 역이 생성이 된다.

3) 이후 역 조회시, 생성한 역을 찾을 수 있다.

/**
 * When 지하철역을 생성하면
 * Then 지하철역이 생성된다
 * Then 지하철역 목록 조회 시 생성한 역을 찾을 수 있다
 */

 

1-2) 인수 테스트 작성

직전에 만든 인수 조건을 기반으로, 이를 만족시키는 인수 테스트를 작성한다.

@DisplayName("지하철역을 생성한다.")
@Test
void createStation() {
    // when
    ExtractableResponse<Response> response = 지하철역_생성("강남역");

    // then
    assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value());

    // then
    List<String> stationNames = 지하철역_전체_조회().jsonPath().getList("name", String.class);
    assertThat(stationNames).containsAnyOf("강남역");
}

private ExtractableResponse<Response> 지하철역_전체_조회() {
    return RestAssured
            .given().log().all()
            .when().get("/stations")
            .then().log().all()
            .extract();
}

private ExtractableResponse<Response> 지하철역_생성(String stationName) {
    return RestAssured.given().log().all()
            .body(Map.of("name", stationName))
            .contentType(MediaType.APPLICATION_JSON_VALUE)
            .when().post("/stations")
            .then().log().all()
            .extract();
}

아직 작동하는 코드가 없으니 테스트는 실패할 것 이다.

 

이제 이를 기반으로 TDD 사이클을 통해 기능을 구현하면 된다.

이에 대한 학습은 다음 수업 주제라, 이후에 정리해보도록 하겠다.

댓글