더북(TheBook)
    var expected =  new Reservation(
        new DateTime(2023, 11, 24, 19, 0, 0),
        dto.Email,
        dto.Name,
        dto.Quantity);
    Assert.Contains(expected, db);
}

앞에서 보았던 테스트와 다르게, 시스템의 HTTP API에 대한 테스트가 아니라, 유닛 테스트21입니다. 이 부분에서 외부 접근 테스트 주도 개발의 핵심 아이디어를 확인할 수 있습니다. 즉, 시스템의 경계에서 시작해서 점차 안쪽으로 들어가면서 작업을 진행하는 것입니다.

이렇게 이의를 제기할 수도 있을 겁니다. “하지만 시스템의 경계는 시스템이 외부 세계와 상호 작용하는 곳이므로, 이 단계에서 동작을 테스트해야 하지 않을까요?”

타당한 의문처럼 보이지만, 아쉽게도 현실적이지 않습니다. 경계에서의 테스트를 통해 모든 동작과 엣지 케이스(edge case)22를 확인하려 한다면 필요한 테스트의 조합이 폭발적으로 증가하기 때문에 이 부분을 모두 확인하려면 테스트를 수만 개는 작성해야 합니다[85]. 하지만 외부 테스트와 분리된 유닛 테스트 수행하면 이런 문제를 해결할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.