TDD(Test Driven Development) 방법으로 개발을 하려고 하던, 몇몇 기능에 대해서만 테스트 코드 작성을 위해서든..
테스트 코드 작성을 위해 이런저런 내용을 찾다보면 자주 보게되는 테스트 더블(Test double)가 정확히 무엇인지에 대해 정리한 글
참고한 내용은 마틴 파울러의 글1, 마틴 파울러의 글2, xunitpattenrs의 Test Double 및 테스트 더블의 각 항목 설명
테스트 더블(Test double) 이란?
테스트 2배! 는 당연히 아니고.. 영화에서 배우가 다칠 수 있는 위험한 장면등을 촬영할 때 대역을 사용하는 경우, 이 대역을 스턴트맨(stuntman)이라고 지칭하는데 이를 좀 더 넓은 범위에 적용(예를 들어 드라마, 뮤직 비디오 등등 모든 범위)하여 지칭을 할 땐 스턴트 더블(stunt double)이라고 지칭합니다.
즉, 테스트 더블이란 간단하게 이야기를 하자면 "테스트를 위한 대역"이라고 볼 수 있으며 조금 더 자세한 설명은 해당 사이트에서 "How it works" 항목을 읽어보시길 권합니다.
테스트 더블 항목
- 테스트 스텁(Stub)
- 테스트 중에 이루어진 호출에 대해 미리 준비된 반환값을 제공
- 테스트를 위해 프로그래밍된 것 이외 동작 X
- 즉, 실제 동작이 아닌 테스트를 위해 프로그래밍된 동작 또는 반환값을 제공
- 정말 간단하게 보자면 호출 시 항상 정해진 반환값만 전달한다고 보면 된다. (극단적 설명)
- 테스트 스파이(Spy)
- 테스트 스텁에 기록 기능을 추가한 것
- 즉, 스텁과 동일한 동작을 지원하면서 호출에 대한 내용을 저장하여 나중에 확인할 수 있도록 지원
- 따라서 호출 후 기록된 내용을 통해 테스트 코드에서 검증
- 목 객체(Mock)
- 테스트 스텁에 간접 출력(indirect output)의 검증을 추가한 것
- 테스트 스텁의 경우 상태 검증(state verification)을 하는 반면, 목 객체는 동작 검증(behavior verification)이 주 목적
- 쉽게 말해 호출에 대한 결과를 검증(상태 검증)을 하는 방식이 아닌 호출에 대한 동작을 검증(동작 검증)하는 방식
- 따라서 호출시 매개변수를 검증하거나, 내부 동작에서 특정 함수나 메서드를 호출하는지 등.. 말 그대로 동작에 대한 검증을 지원
- 페이크 객체(Fake)
- 실제로 구현된 동작이 있지만, 실제 제품(또는 실제 운영 환경)에는 적합하지 않은 객체를 사용하여 테스트하는 경우
- 간단한 예를 들자면, 실제 운영 환경에서는 MySQL 등의 DB를 사용하지만, 테스트 환경에선 인메모리 DB(H2)를 사용하는 경우 인메모리 DB가 페이크 객체로 정의되어 사용된 것
- 더미 객체(Dummy)
- 매개변수 등으로 전달하지만 실제로는 사용되지 않는 객체
- 일반적으로 매개변수를 채워주기 위해 사용
- 테스트 스텁의 동작을 생각해보면 이미 프로그래밍된 결과를 반환하기 때문에 매개변수가 큰 의미가 없을 수 있다. 이때 매개변수에 채워넣는 의미 없는 객체가 더미 객체