핵심 인사이트 (3줄 요약)
- 본질: 테스트 더블(Test Double)은 단위 테스트 수행 시 실제 객체를 대신하여 가짜 역할을 수행하는 '테스트용 대역'으로, Mock, Stub, Fake, Spy, Dummy 등이 있다.
- 가치: DB, 네트워크 등 외부 의존성을 제거하여 테스트 속도를 획기적으로 높이고, 어떤 상황에서도 동일한 결과를 보장하는 '격리된 환경'을 구축한다.
- 판단 포인트: 감리 시에는 테스트 커버리지가 실제 로직을 100% 포괄하는지 확인하며, Mock 객체를 오용해 로직 없이 껍데기만 테스트하고 있지는 않은지 검수한다.
Ⅰ. 개요 및 필요성
결제 기능을 테스트하려는데 진짜 은행 서버에 연결해서 내 돈을 뺄 수는 없다. 또한, DB가 점검 중이라고 해서 내 테스트가 멈춰서도 안 된다. 테스트 더블은 바로 이때 나타나는 '스턴트 대역 배우'다. 진짜 은행 서버 대신 "무조건 성공했다고 해줘"라고 말하는 가짜 객체를 세워두고, 내 코드가 그 결과를 잘 처리하는지만 집중해서 확인하는 것이다. 이를 통해 언제 어디서든 버튼 하나로 수만 개의 테스트를 1분 만에 끝낼 수 있는 강력한 CI/CD 환경이 완성된다.
📢 섹션 요약 비유: 테스트 더블은 영화 촬영장의 '마네킹'이나 '스턴트맨'과 같다. 위험하거나(진짜 결제), 준비하기 힘든(대규모 DB) 상황에서 주인공(테스트 대상 코드)이 빛날 수 있도록 대신 맞아주고 연기해주는 고마운 존재다.
Ⅱ. 아키텍처 및 핵심 원리
1. 테스트 더블의 5가지 유형
- Dummy: 인자 전달을 위해 존재하지만 실제 쓰이지는 않음.
- Stub: 호출 시 미리 준비된 답만 함. (예: "로그인은 성공이야"라고 답정너)
- Spy: 호출된 횟수나 인자 등 정보를 기록하여 나중에 확인.
- Mock: 행위 검증 중심. 특정 메서드가 불렸는지, 순서는 맞는지 감시.
- Fake: 실제 로직은 있지만 단순하게 구현됨. (예: 메모리 내 DB)
2. 격리(Isolation)와 커버리지 검수
- 격리: 외부 환경(DB, API)이 죽어도 내 테스트는 성공해야 함.
- 커버리지 (Coverage): 내 테스트 코드가 실제 소스 코드의 몇 %를 실행해봤는가? (구문, 결정, 조건 커버리지 등)
📢 섹션 요약 비유: Stub은 질문에 "응"이라고만 답하는 인형이고, Mock은 "너 나한테 질문 3번 했지? 순서도 틀렸어!"라고 따지는 까칠한 감독관과 같다.
Ⅲ. 비교 및 연결
주요 테스트 더블 비교 (Stub vs Mock)
| 비교 항목 | 스텁 (Stub, 상태 검증) | 모의 객체 (Mock, 행위 검증) |
|---|---|---|
| 핵심 관심사 | "어떤 값을 돌려주는가?" | "어떻게 호출되었는가?" |
| 확인 방법 | 리턴된 결과값(State) 확인 | 호출 횟수, 인자, 순서(Behavior) 확인 |
| 복잡도 | 비교적 단순함 | 복잡하고 정교한 설정 필요 |
| 비유 | "시험 정답지" | "CCTV 녹화 기록" |
📢 섹션 요약 비유: 요리 테스트를 할 때, Stub은 '미리 만들어둔 맛있는 소스'를 부어 결과만 보는 것이고, Mock은 '요리사가 칼질을 몇 번 했는지, 불 조절은 언제 했는지' 과정을 지켜보는 것이다.
Ⅳ. 실무 적용 및 기술사 판단
기술사 핵심 포인트 (검수 로직):
- 커버리지의 함정: 커버리지가 100%라고 해서 버그가 0인 것은 아니다. "의미 없는 Assert"나 "껍데기 테스트"를 골라내는 눈이 감리원에게 필요하다.
- Fragile Test 방지: Mock을 너무 세세하게 쓰면 작은 코드 수정에도 테스트가 깨진다. 꼭 필요한 행위만 Mocking 하는 '느슨한 테스트'의 중요성을 강조한다.
- Jacoco / Cobertura: Java 환경에서 커버리지를 측정하는 표준 도구 활용 능력을 보여준다.
📢 섹션 요약 비유: 테스트 검수는 '가짜 대역 배우가 너무 튀지 않는지' 체크하는 것이다. 대역(Mock)이 너무 똑똑해서 주인공(실제 로직)이 할 일까지 다 해버리면, 정작 주인공이 연기를 잘하는지(버그가 없는지) 알 수 없기 때문이다.
Ⅴ. 기대효과 및 결론
테스트 더블은 '테스트 주도 개발(TDD)'의 실천을 가능하게 하는 기술적 토대다. 이를 통해 개발자는 두려움 없이 코드를 수정할 수 있는 자신감을 얻는다. 기술사 시험에서는 단위 테스트의 '격리성' 확보 방안으로 테스트 더블의 5가지 유형을 정확히 정의하고, 구문/결정/조건 커버리지의 차이점을 명확히 기술하여 품질 보증의 전문성을 증명해야 한다.
📢 섹션 요약 비유: 테스트 더블은 IT 세상의 '시뮬레이터'다. 실제 비행기(운영 환경)를 띄우기 전, 안전한 지상 연습장(단위 테스트)에서 온갖 고장 상황을 가상으로 만들어보며 조종사(개발자)의 실력을 완벽하게 다듬는 과정이다.
📌 관련 개념 맵
| 개념 | 연관 키워드 | 관계 |
|---|---|---|
| Mockito | Mock 프레임워크 | Java 진영에서 가장 널리 쓰이는 테스트 더블 라이브러리 |
| Code Coverage | Jacoco, 80% 이상 권장 | 테스트가 코드를 얼마나 훑었는지 보여주는 수치 |
| TDD (테스트 주도 개발) | Red-Green-Refactor | 테스트 더블을 가장 적극적으로 활용하는 개발 방법론 |
| Side Effect | 부수 효과, 격리 | 외부 연동으로 인해 테스트 결과가 바뀌는 현상 (테스트 더블로 해결) |
👶 어린이를 위한 3줄 비유 설명
- 진짜 은행에 가서 돈을 찾는 연습을 할 수 없으니까, 장난감 돈을 주는 가짜 은행원을 세워두는 거예요.
- 가짜 은행원이 "여기 돈 있어요"라고 말하면 내가 "고맙습니다"라고 잘 인사하는지(로직 확인) 연습하는 거죠.
- 이렇게 가짜 친구들과 연습을 많이 해두면, 나중에 진짜 은행에 가서도 실수하지 않고 잘할 수 있답니다!