통합 테스트
여러 모듈이나 계층이 함께 동작할 때 올바르게 연동되는지 검증하는 테스트 기법입니다.
핵심 특징
- 모듈 간 상호작용 검증: 컨트롤러 → 서비스 → 리포지토리 등 계층 간 연동을 확인
- 실제 의존성 사용: DB, 메시지 큐 등 외부 시스템을 실제로 연결하거나 테스트용 환경(H2, Testcontainers 등)을 사용
- 단위 테스트가 잡지 못하는 버그 발견: 개별 모듈은 정상이지만 조합 시 발생하는 문제 포착
- 비교적 느린 실행 속도: 외부 의존성 초기화(컨텍스트 로딩, DB 연결 등)로 인해 단위 테스트보다 느림
통합 테스트 범위 예시
[Controller] → [Service] → [Repository] → [DB]
↑ 이 전체 흐름을 하나의 테스트로 검증
| 테스트 유형 | 검증 범위 |
| 서비스 + 리포지토리 | 비즈니스 로직이 실제 DB와 정상 연동되는지 |
| 컨트롤러 + 서비스 | HTTP 요청 → 응답까지의 흐름 |
| 전체 슬라이스 | 컨트롤러 → 서비스 → 리포지토리 → DB 전 구간 |
| 외부 API 연동 | 외부 서비스 호출 및 응답 처리 |
Java 예시 (Spring Boot)
@SpringBootTest
@Transactional // 테스트 후 자동 롤백
class OrderServiceIntegrationTest {
@Autowired
private OrderService orderService;
@Autowired
private ProductRepository productRepository;
@Test
@DisplayName("재고가 있는 상품을 주문하면 재고가 차감된다")
void orderReducesStock() {
// Given
Product product = productRepository.save(
new Product("키보드", 10_000, 100)
);
// When
Order order = orderService.placeOrder(product.getId(), 3);
// Then
Product updated = productRepository.findById(product.getId()).get();
assertThat(order.getStatus()).isEqualTo(OrderStatus.COMPLETED);
assertThat(updated.getStock()).isEqualTo(97);
}
}
주요 테스트 슬라이스 어노테이션 (Spring Boot)
| 어노테이션 | 대상 계층 | 로딩 범위 |
@SpringBootTest | 전체 | 모든 Bean 로딩 |
@WebMvcTest | Controller | MVC 관련 Bean만 로딩 |
@DataJpaTest | Repository | JPA 관련 Bean만 로딩 (내장 DB 사용) |
@RestClientTest | 외부 API 호출 | RestTemplate/WebClient 관련만 로딩 |
단위 테스트 vs 통합 테스트
| 항목 | 단위 테스트 | 통합 테스트 |
| 의존성 | Mock으로 대체 | 실제 또는 테스트용 환경 사용 |
| 속도 | ms 단위 | 초~분 단위 |
| 실패 원인 파악 | 쉬움 (범위가 좁음) | 어려움 (여러 모듈 관여) |
| 신뢰도 | 실제 환경과 차이 가능 | 실제 환경에 더 가까움 |
| 작성 비용 | 낮음 | 높음 |
실무 팁: 단위 테스트로 개별 로직을 충분히 검증한 뒤, 통합 테스트는 핵심 비즈니스 흐름과 모듈 간 경계에 집중하는 것이 효율적입니다.