Test double


테스트시 테스트의 결과의 신뢰성을 떨어뜨리는 주요 원인은 테스트 대상 객체가 다른 객체와 강한 결합되어 있음으로 인해 외부 요인(강한 결합된 다른 객체)에 의해 테스트 결과가 변경될 수 있다는 것이다. 이러한 점은 Test double을 통하여 해결 할 수 있다.

테스트 대상 코드를 격리하고, 속도를 개선하고, 예측 불가능한 요소를 제어하고, 특수한 상황을 시뮬레이션하고, 감춰진 정보를 얻기 위해 기존 객체를 대체하여 사용가능한 대역 객체를 통틀어 test double이라 한다.

 Test double을 사용하기 위해서는 객체 간의 강한 결합을 제거해야 한다. 강하게 결합된 객체를 interface를 상속받도록  하여 약한 결합으로 refactoring을 하면, 해당 interface를 대역 객체로 대체함으로서 해당 객체에 대한 신뢰할 수 있는 테스트작성이 가능하다.

이러한 대역 객체는 역할에 따라 아래와 같이 나뉜다.
  • Stub
    • 의존 class를 원하는 형태로 제어하기 위함
    • 외부 의존 class나 협력 객체를 대신함으로서 테스트 범위에서 제거
  • Fake
    • 의존하는 객체가 느리거나 준비되지 않았을때 해당 객체를 대용하기 위함
  • Spy
    • 접근 불가능한 내부 정보를 테스트 하기 위함
    • 목격한 일을 기록하여 나중에 테스트시 확인 할 수 있도록 함
  • Mock
    • 기대한 상호작용이 진짜 발생하였는지 확인하는 행위기반 검증을 위한 테스트 대역
    • 반환값이 없거나 상태 확인만으로 기대 동작을 보장할 수 없을경우 사용
Stub과 fake는 테스트 범위에 포함되지않는 객체를 대신하기위해 만드는 점에선 역할이 겹치는점에선 역할이 같지만 이둘을 구분하는 기준은 내부로직의 유뮤이다.
 Stub은 복잡한 로직없이 입력에 대한 정해진 결과를 단순히 반환하지만 Fake는 business logic을 가지고 "동작"한다는 점에서 차이가 있다.

댓글

이 블로그의 인기 게시물

Raspberry pi 한글 설정 및 chromium 설치

Google Test를 이용한 Class의 Private/Protected Member Test