우아한 테크캠프 Pro — 4주차
4주차 — 인수 테스트 주도 개발
4주차 강의
4주차 강의 앞서 3주차에 진행했던 지하철노선 미션에 요구사항을 추가하면서 ATDD(인수테스트)를 경험하는 미션이었다.
먼저 ATDD란 A(Acceptance) + TDD로써, 단위테스트의 분야가 되는 TDD에 API를 호출하는 부분까지 함께 구현하는 방법이다.
TDD의 단위테스트는 개발팀 입장에서 정상적으로 개발이 되었는가를 판단할 수 있지만, ATDD는 프로덕트 오너의 입장에서 비즈니스의 목적에 맞게 정상적으로 동작하느냐를 측정할 수 있다는 조금 더 거시적인 관점으로 보는 것이 이해가 용이할 것 같다.
개발용어중 TDD, BDD, 그리고 ATDD를 비교해서 볼 수 있는데,
TDD는 기능구현에 중점인 개발방법이다.
그리고 BDD는 행위에 중점. 즉 given(주어진 상황), when(조건), then(결과)의 원칙으로써 기능을 나누어 행위 검증에 대해 포커스가 맞춰져있다.
ATDD는 요구사항이 올바르게 구현됐는지에 포커스가 맞춰져 있으므로, API호출의 인터페이스를 테스트하는 것으로 볼 수 있다.
최종 개발 순서는 인수테스트를 구현하는데 BDD 스타일로 TDD를 구현하는 순서로 개발을 진행하게 된다.
RestAssured
TDD는 Junit Test를 이용해서 테스트를 구현했었지만, ATDD의 ‘인수테스트'는 RestAssured를 활용해서 API 테스트를 구현했다.
RestAssured는 이번 강의를 통해 처음 알게된 라이브러리였는데, 객체만 TDD로 접근할 수 있었던 이전 지식에서, API 자체를 테스트 할 수 있는 라이브러리를 새롭게 알게 되었다. 혼자 프로젝트를 진행하면서 API 자체에 대한 테스트를 어떻게 구현해야하는지 몰랐었는데 이번 강의를 통해 알게됐다.
@Test
public void lotto_resource_returns_200_with_expected_id_and_winners() {
when().
get("/lotto/{id}", 5).
then().
statusCode(200).
body("lotto.lottoId", equalTo(5),
"lotto.winners.winnerId", hasItems(23, 54)); }
미션은 ATDD에 대한 리뷰보다는 메서드의 목적과 기능에 대해 리뷰를 받은게 많았다.
code: https://github.com/byungkyu-ju/atdd-subway-admin
PR #1: https://github.com/next-step/atdd-subway-admin/pull/20
PR #2: https://github.com/next-step/atdd-subway-admin/pull/82
PR #3: https://github.com/next-step/atdd-subway-admin/pull/97
PR #4: https://github.com/next-step/atdd-subway-admin/pull/104