Tag Archives: tdd

[번역] TestDouble

17 January 2006
http://martinfowler.com/bliki/TestDouble.html

제라드 메스자로스(Gerard Meszaros)는 다양한 xUnit 프레임워크에서 사용하는 패턴을 “xUnit Test Patterns”이라는 책에서 설명했다. 이때 시스템에서 테스트에 해당하는 부분을 스텁(stub), mock, fake, 더미(dummy) 등 사람들이 서로 다른 용어를 사용해서 가리킨다는 점이 가장 곤혹스러웠다. 이러한 상황을 정리하고자 제라드는 용어를 직접 만들어냈다. 나는 이들 용어를 널리 알려야 할 필요성을 느꼈다.

제네릭(generic)한 수준에서 Test Double이라는 용어를 사용했다 (stunt double를 생각해 보라). Test Double이란 제네릭한 용어로 테스트를 목적으로 만들어진 객체를 시스템에서 실제로 사용할 객체로 대체할 수 있는 경우라면, 이러한 테스트용 객체를 지칭한다. 제라드는 Test Double을 다음과 같이 다양한 종류로 구분했다.

역주) stunt double: 스턴트 대역을 뜻한다.

  • 더미(Dummy) 객체
    더미 객체란 메서드에 전달하기 위해 사용하지만, 더미 객체를 실제로는 사용하지는 않는다. 더미 객체는 파리미터 목록을 채우기 위한 목적으로 주로 사용된다.
  • Fake 객체
    Fake 객체의 경우 실제 인터페이스를 구현하지만, 운영할 시스템에서 실제로 사용하기에는 부적절한 값으로 적당히 구현된다 (InMemoryTestDatabase가 좋은 예다).
  • 스텁(Stub)
    스텁은 테스트를 수행할 때 호출에 응답할 수 있게 미리 준비해서 만들어진다. 하지만 애초에 테스트할 목적으로 만들어진 이외의 호출에는 전혀 응답하지 못한다.
  • 스파이(Spy)
    스텁과 유사하지만, 실제 객체가 호출되는 방식에 기반해서 특정 정보를 기록해둔다. 예를 들어 이메일 서비스에서 메시지가 전송된 횟수글 기록한다면, 해당 서비스 객체는 스파이라고 볼 수 있다.
  • Mock
    기대치(expection)를 사용해서 실제 호출에서 받아야 하는 스펙에 따라 Mock을 미리 프로그래밍한다. 그러면 Mock이 기대했던 것과 다른 호출을 받으면 예외를 던진다. 또한 검증하는 동안 Mock이 기대했던 호출을 확실히 모두 받았는지 검사한다.