테스트 더블?

  • xUnit Test Patterns의 저자인 제라드 메스자로스(Gerard Meszaros)가 만든 용어로, 스턴트 더블(영화 촬영에서 말하는 스턴트 대역 배우)에서 아이디어를 얻었다고 한다.
    • 스턴트 더블 이미지를 검색해보면 마치 쌍둥이 같은 스턴트 더블 배우들의 멋진 사진을 볼 수 있다.

제라드 메스자로스는 Test Double 문서에서 다음과 같이 테스트 더블을 소개한다.

When we are writing a test in which we cannot (or chose not to) use a real depended-on component (DOC), we can replace it with a Test Double. The Test Double doesn’t have to behave exactly like the real DOC; it merely has to provide the same API as the real one so that the SUT thinks it is the real one!

  • 테스트 코드를 작성할 때 실제 DOC(depoended-on component; 의존 구성 요소)를 사용할 수 없다면, DOC 대신 테스트 더블로 대체할 수 있음.
  • 테스트 더블은 실제 DOC와 똑같이 행동하지 않아도 되며, 똑같은 API만 제공하면 된다.

한편 마틴 파울러는 자신의 블로그에서 제라드 메스자로스의 테스트 더블 개념을 다음과 같이 짧게 소개한다.

Test Double is a generic term for any case where you replace a production object for testing purposes. There are various kinds of double that Gerard lists:

  • 테스트 더블은 테스트 목적을 위해 프로덕션 객체를 다른 무언가로 교체하는 모든 경우를 표현하는 용어이다.

테스트 더블의 종류

xunits 문서에서 잘 설명하고 있지만 마틴 파울러의 소개가 간단하여 이해하기 쉬웠다.

  • Fake objects actually have working implementations, but usually take some shortcut which makes them not suitable for production (an InMemoryTestDatabase is a good example).
  • Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what’s programmed in for the test.
  • Spies are stubs that also record some information based on how they were called. One form of this might be an email service that records how many messages it was sent.
  • Mocks are pre-programmed with expectations which form a specification of the calls they are expected to receive. They can throw an exception if they receive a call they don’t expect and are checked during verification to ensure they got all the calls they were expecting.
  • Dummy 객체는 전달되지만 실제로는 사용되지 않는다. 일반적으로 매개 변수 목록을 채우기 위해 사용된다.
  • Fake 객체는 실제로 작동하는 구현이지만 일반적으로 프로덕션에는 적합하지 않은 꼼수를 사용한다(InMemoryTestDatabase 가 좋은 예).
  • Stub은 테스트 중에 호출되면 미리 준비된 결과를 제공한다. 보통은 테스트를 위해 프로그래밍한 내용이 아니면 응답하지 않는다.
  • Spy는 자신이 호출된 방법/과정 등의 정보를 기록하는 stub. 보낸 메일의 수를 기록하는 이메일 서비스를 예로 들 수 있다.
  • Mock은 호출했을 때 사전에 정의된 명세대로의 결과를 돌려주도록 미리 프로그램되어있다. 예상치 못한 호출이 있을 경우 예외를 던질 수 있으며, 모든 호출이 예상된 것이었는지 확인할 수 있다.

(책) xUnit 테스트 패턴에서의 용어 정리

다음은 “xUnit 테스트 패턴”의 부록 B를 참고해 작성한 것이다.

  • SUT: System Under Test, 테스트 대상 시스템, 테스트를 하려는 대상.
패턴 목적 동작이 있는가 SUT에 간접 입력 주입 SUT 간접 출력 처리 테스트(테스터)가 제공하는 값 예제
가짜 객체
Fake Object
(실행할 수 없는) 테스트를 (빠르게) 실행 있음 없음 간접 출력을 사용함 없음 메모리 데이터베이스 에뮬레이터
더미 객체
Dummy Object
속성이나 메소드 인자 없음 하지 않음 하지 않음 없음 Null,
'Ignored String',
new Object
모의 객체
Mock Object
SUT의 간접 출력 검증 있음 선택 사항 기대 값과 비교해 정확한지 검증 입력(선택 사항)과 기대 출력
임시 테스트 스텁
Temporary Test Stub
아직 작성하지 않은 프로시저 코드 대신에 집어넣기 위해 있음 없음 간접 출력을 사용함 없음 메모리 데이터베이스 에뮬레이터
테스트 스텁
Test Stub
SUT의 간접 입력 검증 있음 한다 무시함 입력
테스트 스파이
Test Spy
SUT의 간접 출력 검증 있음 선택 사항 나중에 검증하려고 갈무리해 둠 입력(선택 사항)

Links

참고문헌

  • xUnit 테스트 패턴 / 제라드 메스자로스 저 / 박일 역 / 에이콘출판사 / 2011년 11월 10일 / 원제 : xUnit Test Patterns: Refactoring Test Code