
통합 테스트 환경 구축부터 골든 마스터 기법까지, 흔들리지 않는 튼튼한 테스트 코드를 만드는 실무 가이드
AI 에이전트와 함께 작성하며 폭발적으로 증가한 Mock 테스트의 실체를 파헤치고 이를 구조적으로 해결한 실무 전환 과정을 소개합니다. Testcontainers와 WireMock을 활용해 포트 충돌 없이 격리된 통합 테스트 인프라를 손쉽게 구축한 노하우를 공유합니다. 나아가 계산 오차를 1원 단위까지 감지하는 특성화 테스트 기법과 기록형 Mock 설계를 통해 레거시 코드를 안전하게 리팩토링하는 여정을 생생히 보여줍니다.
AI 코딩 도구를 적용한 후 늘어나는 테스트 유지보수 비용으로 고통받거나, 작은 구현 변경에도 수많은 Mock 단언문이 깨져 스트레스를 받는 백엔드 엔지니어 및 테크 리드에게 일독을 강력히 권장합니다.
어필리에이트 서비스의 3개 TypeScript 백엔드 서버에서 통합 테스트가 전혀 없는 상황에서 테스트 작성을 AI 에이전트에 의존한 결과, 무분별하게 Mock이 양산되어 최대 2,199개까지 증가했습니다. 이로 인해 사소한 시그니처 변경에도 무관한 테스트들이 깨지고, 실제 입출력 값 검증 대신 단순 호출 여부만 검증하는 취약한 구조가 고착화되었습니다.
Testcontainers와 WireMock을 도입하여 실제 운영 환경과 유사한 격리된 통합 테스트 환경을 구축했습니다. DB 연동 로직은 통합 테스트로 검증하고, 외부 프로세스 경계는 호출 횟수가 아닌 송신 페이로드를 검증하는 기록형 Mock으로 전환하였으며, 리팩토링 안정성을 담보하기 위해 대량의 금액 계산 조합을 스냅샷으로 동결하는 특성화 테스트(Golden Master)를 구현했습니다.
정교한 테스트 인프라 구축과 점진적인 전환 작업을 거쳐 Mock의 개수를 기존 2,199개에서 단 4개로 대폭 축소하는 데 성공했습니다. 더불어 테스트 코드 내의 777건의 lint 규칙 위반 부채를 전량 해결하여 정상적인 CI 게이트를 복구하였고 계산 로직 변경 시의 미세한 오차도 원천적으로 차단할 수 있게 되었습니다.
Trade-off
실제 도커 컨테이너를 띄워 DB 및 외부 API 스텁을 검증하므로, 순수 메모리 기반의 유닛 테스트에 비해 초기 인프라 설정 비용이 크고 로컬 및 CI 파이프라인상에서의 전체 테스트 실행 시간이 소폭 증가할 수 있습니다. 또한 현재의 결과값을 그대로 스냅샷화하는 특성화 테스트 방식의 특성상 기존 코드 내에 존재하던 잠재적 버그까지 정상 스펙으로 오인하여 동결시킬 수 있으므로 면밀한 검증 검토가 동반되어야 합니다.
Docker 컨테이너를 사용하여 테스트 실행 시 데이터베이스나 캐시 등의 실제 인프라 구성 요소를 코드 레벨에서 주입하고 라이프사이클을 손쉽게 제어할 수 있게 돕는 라이브러리입니다.
HTTP 기반의 외부 서비스를 스터빙하고 요청 및 응답을 시뮬레이션할 수 있는 가상 목 서버 도구로, 통신 사양 분석과 요청 데이터 유효성 검사를 독립적으로 수행합니다.
현재 구현된 코드가 산출하는 다양한 스냅샷 결과를 기준 지표(골든 마스터)로 삼아 안전핀을 잠근 채 구조를 개편하고 의도치 않은 변조를 추적하는 역공학 테스트 기법입니다.