Test Double
소프트웨어 테스트에서 실제 객체를 대신하여 사용되는 테스트용 객체를 말합니다.
이것은 마치 영화에서 위험한 장면을 연기하는 스턴트 더블과 비슷한 개념이다.
실제 구현체를 사용하기 어렵거나 비용이 많이 드는 상황에서 테스트를 용이하게 만들어주는 중요한 기법.
목적:
- 테스트 대상 코드를 외부 요인으로부터 격리
- 테스트 속도 개선
- 예측 불가능한 요소 제거
- 특정 상황 시뮬레이션
- 감춰진 정보 획득
장점:
- 외부 의존성 제거로 인한 테스트의 안정성 향상
- 테스트 실행 속도 개선
- 특정 시나리오 테스트 용이성 증가
- 아직 개발되지 않은 컴포넌트의 동작 시뮬레이션 가능
주의사항:
- 실제 객체와의 차이로 인한 오류 가능성
- 과도한 사용 시 테스트 코드의 복잡성 증가
- 실제 환경과의 차이로 인한 테스트 신뢰성 저하 가능성
테스트 더블의 종류
테스트 더블은 주로 다음 5가지 유형으로 분류된다.
더미 객체(Dummy Objects)
단순히 인스턴스화된 객체로, 기능은 필요하지 않을 때 사용된다.
|
|
가짜 객체(Fake Objects)
실제 구현을 단순화한 객체로, 주로 데이터 접근 계층을 대체할 때 사용된다.
|
|
스텁(Stubs)
미리 정의된 응답을 제공하는 객체로, 특정 상태를 시뮬레이션할 때 사용된다.
|
|
스파이(Spies)
실제 객체의 기능을 유지하면서 추가적인 정보를 기록하는 객체.
|
|
목(Mocks)
예상되는 호출과 그에 대한 응답을 미리 프로그래밍한 객체로, 행위 검증에 사용된다.
|
|
Test Dobule 기법의 비교
특성 | Dummy Objects | Stubs | Fakes | Spies | Mocks |
---|---|---|---|---|---|
주요 목적 | 파라미터 채우기 | 미리 준비된 응답 제공 | 실제 구현의 단순화 | 호출 기록 및 검증 | 예상 동작 검증 |
동작 방식 | 아무 동작 없음 | 하드코딩된 응답 반환 | 실제와 유사하게 동작 | 호출 정보 기록 | 기대 동작 프로그래밍 |
구현 복잡도 | 매우 낮음 | 낮음 | 중간 | 높음 | 매우 높음 |
행위 검증 | 불가능 | 제한적 | 가능 | 상세 가능 | 매우 상세 가능 |
상태 검증 | 불가능 | 가능 | 가능 | 가능 | 가능 |
실제 로직 포함 | 없음 | 최소한 | 단순화된 형태 | 선택적 | 선택적 |
적합한 사용 사례 | 미사용 의존성 | 간단한 입출력 | 복잡한 의존성 | 호출 추적 필요 | 정확한 동작 검증 |
설정 난이도 | 매우 쉬움 | 쉬움 | 보통 | 어려움 | 매우 어려움 |
유지보수 비용 | 매우 낮음 | 낮음 | 중간 | 높음 | 매우 높음 |
테스트 취약성 | 매우 낮음 | 낮음 | 중간 | 높음 | 매우 높음 |
각 기법의 세부적인 특징:
Dummy Objects:
- 가장 단순한 형태의 Test Double
- 실제로 사용되지 않는 파라미터를 위한 자리 표시자
- 어떤 동작도 수행하지 않음
- 실제 메서드가 호출되면 안 됨
Stubs:
- 미리 정의된 응답을 제공
- 테스트 시나리오에 필요한 상태를 하드코딩
- 단순한 조건부 동작 가능
- 입력에 따른 다른 응답 제공 가능
Fakes:
- 실제 구현의 단순화된 버전
- 동작하는 구현을 포함
- 실제 객체와 유사하게 동작
- 메모리 내 구현으로 성능 향상
Spies:
- 메서드 호출을 기록하고 추적
- 호출 횟수, 파라미터, 순서 등을 기록
- 실제 구현과 함께 사용 가능
- 상세한 호출 정보 제공
Mocks:
- 가장 복잡하고 강력한 Test Double
- 기대하는 동작을 미리 프로그래밍
- 상호작용 검증에 중점
- 매우 구체적인 행위 검증 가능
선택 기준:
단순한 의존성 처리만 필요한 경우:
- Dummy Objects 사용
특정 응답만 필요한 경우:
- Stubs 사용
복잡한 동작의 단순화가 필요한 경우:
- Fakes 사용
메서드 호출 추적이 필요한 경우:
- Spies 사용
정확한 상호작용 검증이 필요한 경우:
- Mocks 사용
이러한 기법들의 효과적인 사용을 위해서는 다음 사항들을 고려해야 한다:
- 테스트의 목적과 범위
- 구현의 복잡성
- 유지보수 비용
- 테스트 실행 속도
- 테스트의 가독성과 이해도