핵심 인사이트 (3줄 요약)

  1. 본질: 테스트 더블(Test Double)은 단위 테스트 수행 시 실제 객체를 대신하여 가짜 역할을 수행하는 '테스트용 대역'으로, Mock, Stub, Fake, Spy, Dummy 등이 있다.
  2. 가치: DB, 네트워크 등 외부 의존성을 제거하여 테스트 속도를 획기적으로 높이고, 어떤 상황에서도 동일한 결과를 보장하는 '격리된 환경'을 구축한다.
  3. 판단 포인트: 감리 시에는 테스트 커버리지가 실제 로직을 100% 포괄하는지 확인하며, Mock 객체를 오용해 로직 없이 껍데기만 테스트하고 있지는 않은지 검수한다.

Ⅰ. 개요 및 필요성

결제 기능을 테스트하려는데 진짜 은행 서버에 연결해서 내 돈을 뺄 수는 없다. 또한, DB가 점검 중이라고 해서 내 테스트가 멈춰서도 안 된다. 테스트 더블은 바로 이때 나타나는 '스턴트 대역 배우'다. 진짜 은행 서버 대신 "무조건 성공했다고 해줘"라고 말하는 가짜 객체를 세워두고, 내 코드가 그 결과를 잘 처리하는지만 집중해서 확인하는 것이다. 이를 통해 언제 어디서든 버튼 하나로 수만 개의 테스트를 1분 만에 끝낼 수 있는 강력한 CI/CD 환경이 완성된다.

📢 섹션 요약 비유: 테스트 더블은 영화 촬영장의 '마네킹'이나 '스턴트맨'과 같다. 위험하거나(진짜 결제), 준비하기 힘든(대규모 DB) 상황에서 주인공(테스트 대상 코드)이 빛날 수 있도록 대신 맞아주고 연기해주는 고마운 존재다.


Ⅱ. 아키텍처 및 핵심 원리

1. 테스트 더블의 5가지 유형

  1. Dummy: 인자 전달을 위해 존재하지만 실제 쓰이지는 않음.
  2. Stub: 호출 시 미리 준비된 답만 함. (예: "로그인은 성공이야"라고 답정너)
  3. Spy: 호출된 횟수나 인자 등 정보를 기록하여 나중에 확인.
  4. Mock: 행위 검증 중심. 특정 메서드가 불렸는지, 순서는 맞는지 감시.
  5. Fake: 실제 로직은 있지만 단순하게 구현됨. (예: 메모리 내 DB)

2. 격리(Isolation)와 커버리지 검수

  • 격리: 외부 환경(DB, API)이 죽어도 내 테스트는 성공해야 함.
  • 커버리지 (Coverage): 내 테스트 코드가 실제 소스 코드의 몇 %를 실행해봤는가? (구문, 결정, 조건 커버리지 등)

📢 섹션 요약 비유: Stub은 질문에 "응"이라고만 답하는 인형이고, Mock은 "너 나한테 질문 3번 했지? 순서도 틀렸어!"라고 따지는 까칠한 감독관과 같다.


Ⅲ. 비교 및 연결

주요 테스트 더블 비교 (Stub vs Mock)

비교 항목스텁 (Stub, 상태 검증)모의 객체 (Mock, 행위 검증)
핵심 관심사"어떤 값을 돌려주는가?""어떻게 호출되었는가?"
확인 방법리턴된 결과값(State) 확인호출 횟수, 인자, 순서(Behavior) 확인
복잡도비교적 단순함복잡하고 정교한 설정 필요
비유"시험 정답지""CCTV 녹화 기록"

📢 섹션 요약 비유: 요리 테스트를 할 때, Stub은 '미리 만들어둔 맛있는 소스'를 부어 결과만 보는 것이고, Mock은 '요리사가 칼질을 몇 번 했는지, 불 조절은 언제 했는지' 과정을 지켜보는 것이다.


Ⅳ. 실무 적용 및 기술사 판단

기술사 핵심 포인트 (검수 로직):

  1. 커버리지의 함정: 커버리지가 100%라고 해서 버그가 0인 것은 아니다. "의미 없는 Assert"나 "껍데기 테스트"를 골라내는 눈이 감리원에게 필요하다.
  2. Fragile Test 방지: Mock을 너무 세세하게 쓰면 작은 코드 수정에도 테스트가 깨진다. 꼭 필요한 행위만 Mocking 하는 '느슨한 테스트'의 중요성을 강조한다.
  3. Jacoco / Cobertura: Java 환경에서 커버리지를 측정하는 표준 도구 활용 능력을 보여준다.

📢 섹션 요약 비유: 테스트 검수는 '가짜 대역 배우가 너무 튀지 않는지' 체크하는 것이다. 대역(Mock)이 너무 똑똑해서 주인공(실제 로직)이 할 일까지 다 해버리면, 정작 주인공이 연기를 잘하는지(버그가 없는지) 알 수 없기 때문이다.


Ⅴ. 기대효과 및 결론

테스트 더블은 '테스트 주도 개발(TDD)'의 실천을 가능하게 하는 기술적 토대다. 이를 통해 개발자는 두려움 없이 코드를 수정할 수 있는 자신감을 얻는다. 기술사 시험에서는 단위 테스트의 '격리성' 확보 방안으로 테스트 더블의 5가지 유형을 정확히 정의하고, 구문/결정/조건 커버리지의 차이점을 명확히 기술하여 품질 보증의 전문성을 증명해야 한다.

📢 섹션 요약 비유: 테스트 더블은 IT 세상의 '시뮬레이터'다. 실제 비행기(운영 환경)를 띄우기 전, 안전한 지상 연습장(단위 테스트)에서 온갖 고장 상황을 가상으로 만들어보며 조종사(개발자)의 실력을 완벽하게 다듬는 과정이다.


📌 관련 개념 맵

개념연관 키워드관계
MockitoMock 프레임워크Java 진영에서 가장 널리 쓰이는 테스트 더블 라이브러리
Code CoverageJacoco, 80% 이상 권장테스트가 코드를 얼마나 훑었는지 보여주는 수치
TDD (테스트 주도 개발)Red-Green-Refactor테스트 더블을 가장 적극적으로 활용하는 개발 방법론
Side Effect부수 효과, 격리외부 연동으로 인해 테스트 결과가 바뀌는 현상 (테스트 더블로 해결)

👶 어린이를 위한 3줄 비유 설명

  1. 진짜 은행에 가서 돈을 찾는 연습을 할 수 없으니까, 장난감 돈을 주는 가짜 은행원을 세워두는 거예요.
  2. 가짜 은행원이 "여기 돈 있어요"라고 말하면 내가 "고맙습니다"라고 잘 인사하는지(로직 확인) 연습하는 거죠.
  3. 이렇게 가짜 친구들과 연습을 많이 해두면, 나중에 진짜 은행에 가서도 실수하지 않고 잘할 수 있답니다!