피드로 돌아가기
컬리 기술블로그Backend
원문 읽기
TestContainers로 유저시나리오와 비슷한 통합테스트 만들어 보기
Coupang 딜리버리팀이 TestContainers로 마이크로서비스 간 제약조건 버그를 사전 발견하는 통합테스트 구축
AI 요약
Context
단일 마이크로서비스 단위의 통합테스트는 서비스 간 상이한 비즈니스 로직(배송 가능 지역 필터링 등)으로 인한 버그를 발견하기 어렵다. 개발자가 각 서비스의 관심사에 맞춰 mock 데이터로 테스트하면 실제 배포 후 QA 단계에서만 버그가 노출되어 배포 주기가 지연된다.
Technical Solution
- 마이크로서비스 간 통합 시뮬레이션으로 전환: 이벤트 브로커(Kafka) → 이벤트 수집 서버 → DB 조회 서버 전체 흐름을 Docker 컨테이너로 자동화 테스트
- TestContainers 라이브러리 도입: KafkaContainer, PostgresContainerExtension, GenericContainer를 사용해 Kafka, PostgreSQL, Spring Application 이미지를 JUnit 테스트 런타임에 동적 실행
- 컨테이너 이미지 신선도 관리: withImagePullPolicy(PullPolicy.alwaysPull()) 설정으로 테스트 실행 시마다 최신 이미지를 재다운로드해 코드 변경사항 반영 보장
- Kafka 프로듀서를 통한 엔드-투-엔드 메시지 흐름 검증: 주문 이벤트를 실제 Kafka 토픽에 발행 → 수집 서버에서 소비 → DB 저장 → 조회 API에서 응답 확인까지 시나리오 테스트
- GitHub Actions 워크플로우 트리거: 배포 이미지 생성(deploy dev automatically) 완료 후 자동으로 통합테스트 실행해 QA 진행 전 기본 케이스 검증
Key Takeaway
마이크로서비스 아키텍처에서는 단일 서비스 통합테스트만으로는 서비스 간 경계에서의 데이터 흐름 불일치를 발견할 수 없으므로, TestContainers를 활용해 실제 인프라와 동일한 환경에서 엔드-투-엔드 시나리오 테스트를 자동화하는 것이 배포 안정성과 QA 효율성을 동시에 확보하는 핵심 전략이다.
실천 포인트
다중 마이크로서비스로 구성된 백엔드 시스템에서 TestContainers를 사용해 Kafka, PostgreSQL 같은 실제 인프라 이미지를 컨테이너로 구동한 후 서비스 간 데이터 흐름을 엔드-투-엔드로 테스트하면, mock 기반 단위 테스트로는 놓치기 쉬운 서비스 간 제약조건 불일치 버그를 개발 단계에서 조기 발견할 수 있다.