본문 바로가기

책/테스트 주도 개발 시작하기(완)

7장 대역

대역의 필요성

  • 테스트 대상이 이런 외부 요인에 의존하면 테스트를 작성하고 실행하기 어려워진다.
  • 외부 요인은 테스트 작성을 어렵게 만들 뿐만 아니라 테스트 결과도 예측할 수 없게 만든다.
  • 테스트 대상에서 의존하는 요인 때문에 테스트가 어려울 때는 대역을 써서 테스트를 진행할 수 있다.
  • 영어로 된 테스트 관련 글을 읽으면 test double이란 표현이 자주 나오는데 여기서 double은 본 장에서 설명하는 대역에 해당한다.
  • 대역에는 종류는 스텁, 가짜, 스파이, 모의 객체가 존재하는데 각 대역 종류마다 쓰임새가 다르다.

대역을 사용한 외부상황 흉내와 결과 검증

  • 스텁 : 구현을 단순한 것으로 대체한다. 테스트에 맞게 단순히 원하는 동작을 수행한다.
  • 가짜 : 제품에는 적합하지 않지만 실제 동작하는 구현을 제공한다.
  • 스파이 : 호출된 내역을 기록한다. 기록한 내용은 테스트 결과를 검증할 때 사용한다.
  • 모의 : 기대한 대로 상호작용하는지 행위를 검증한다. 기대한 대로 동작하지 않으며 익센션을 발생할 수 있다.
  • 구현하기 전에 모든 기능을 설계하는 것을 불가능하다. 왜냐면 개발을 진행하는 동안에도 요구사항이 계속해서 바뀌기 때문이다. 그럼에도 불구하고 단위 기능을 구현하기에 앞서 어떤 구성 요소가 필요할지 고민하는 것은 의존 대상을 도출할때 도움이 된다.
  • 상수를 이용해서 테스트를 통과시킨 다음에 구현을 일반화할 방법이 떠오르지 않으면 예를 추가하면서 점진적으로 구현을 완성해 나가면 된다.

상황과 결과 확인을 위한 협업 대상(의존) 도출과 대역 사용

  • 제어하기 힘든 외부 상황을 별도 타입으로 분리
  • 테스트 코드는 별도로 분리한 타입의 대역을 생성
  • 생성한 대역을 테스트 대상의 생성자 등을 이용해서 전달
  • 대역을 이용해서 상황 구성

모의 객체 과하게 사용하지 않기

  • 저장소에 대한 대역은 모의 객체를 사용하는 것보다 메모리를 이용한 가짜 구현을 사용하는 것이 테스트코드 관리에 유리하다.