TEST

테스트 대역(Test Double) - Mock, Stub, Spy,Dummy,Fake

wul_e 2023. 5. 26. 15:29

토비 스프링 5장 서비스 추상화에 대해 공부하다가 테스트 대역의 종류로 대표적인 테스트 스텁이 등장한다.

이전에 테스트에 대한 블로그 글을 작성하면서 테스트에 대한 중요성을 언급했었다. 그래서 또 다른 테스트 방법에 대해 공부해보기 위해 테스트 대역을 구글링해 보았다. 테스트 대역이 스텁 말고도 종류가 다양하기에 이참에 테스팅 종류의 대해 공부하여 이해한 토대로 정리해보려고 한다. 

 

테스트 대역(Test Double)이란?

  • 미국 소프트웨어 개발자인 마틴 파울러는 Test Double을 테스트계의 스턴트맨이라고 소개한다.
    스턴트맨은 미국에서 스턴트 더블(Stunt Double)이라는 용어로 불리며, 영화를 촬영할 때 배우를 대신하여 위험한 역할을 하는 대역을 말한다. 그래서 대역을 쓰는 것에 착안하여 이름을 지었다.
  • 테스트 환경을 만들어주기 위해, 테스트 대상이 되는 오브젝트의 기능에만 충실히 수행하면서, 빠르게, 자주 테스트를 실행할 수 있도록 사용하는 오브젝트이다.
  • 즉, 실제 객체가 아닌 단순한 객체(가상 객체)를 이용하여 테스트하는 것을 Test Double이다.

 

 

테스트 대역(Test Double)의 종류

 

출처:http://xunitpatterns.com/Test %20Double .html

 

더미 객체 (Dummy Object)

Dummy Object 는 가장 기본적인 테스트 더블로, 객체가 필요하지만 내부 기능이 필요하지 않을 때 사용하게 된다. 

함수 파라미터만 전달되는 용도로만 사용하고 내부에서 사용되지 않는 경우입니다. (인스턴스화 된 객체가 필요할 뿐)

실제로 사용되지 않기때문에 위의 그림에서 점선으로 표현되었다.  (컴파일 테스트)

 

 

가짜 객체 (Fake Object)

Fake Object 는 실제로 사용되는 객체는 아니지만 같은 동작을 하는 구현된 객체이다.

예를들어 테스트하기위해서 DAO를 이용해야하는데 아직 구현되지 않았거나 독립적인 테스트를 하고 싶을 때

FakeDAO 객체를 사용하는 것이다. FakeDAO 객체는 임의의 HashMap 객체를 생성하고 마치 진짜인 것처럼, 실제 데이터베이스 설계를 연기하면서 테스트를 진행한다. (메모리, 연동 테스트 경우)

 

 

스텁 (Stub)

Stub 은 전체 중 일부라는 뜻으로, Dummy 데이터가 실제로 동작하도록(하는 것처럼) 만들어둔 객체이다. 

모든 기능 대신 일부 기능에 집중하여 임의로 구현하여 테스트하는 기능이다.

테스트 중 메서드가 호출된 경우에 특정 상태를 가정해서 응답하기 위해 미리 반환 값을 정의(하드코딩된 형태)한 후 응답(리턴)한다.

상태를 검증하기 위함이다. (상태 기반 테스트)

보통 테스트를 위해 만들어지며 테스트 이외에 사용되지 않는다. (단순히 기능만 테스트할 경우)

 

 

모의 (Mock)

Mock 은 행위를 검증하기 위해 가짜 객체를 만들고 테스트하는 방법이다. (행위 기반 테스트) 

사전에 정의된 명세대로의 결과를 돌려주도록 미리 프로그래밍 되어 있다.

예상치 못한 호출이 있을 경우 예외를 던질 수 있으며, 모든 호출이 예상된 것이었는지 확인 할 수 있다. 

행위 기반 테스트는 복잡도, 정확성 등 작성하기 어려운 부분이 많기 때문에 상태 기반 테스트가 가능하다면

행위 기반 테스트는 만들지 않는다. 

 

 

스파이 (Spy)

Spy 는 Stub의 역할을 하면서 약간의 정보를 더 기록한다. 

예상된 메서드가 잘 호출 되었는지, 몇번이나 호출 되었는지 등의 정보를 기록하거나 검증하는데에 사용된다.

 

 

 

 

테스트 대역과 그 종류들에 대해 알아보았다. 테스트 대역을 사용하는 이유는 클래스와 클래스끼리의 의존도가 있어 테스트 할 필요가 없는 클래스나 메소드까지 하게되는 불필요함을 줄이기위해, 하나의 클래스만 단독으로 테스트 하기 어려움을 해결하기 위함이다. 실제가 아닌 가상 객체로 분리하여 테스트를 진행하며 위의 테스트 종류들 중에서 어떤 테스트가 필요할지 결정하고 테스트를 진행해야 한다. 잘 모르는 상태에서 사용하게된다면 예상치 못하게 테스트만 했을 뿐인데 작성에 어려움을 겪고 복잡함을 겪게 될 것이다. 

 

 


참고자료

 

 

Mocks Aren't Stubs

Explaining the difference between Mock Objects and Stubs (together with other forms of Test Double). Also the difference between classical and mockist styles of unit testing.

martinfowler.com