본문으로 건너뛰기
SDETRole
SDETRole

용어집 · 테스트 기초

통합 테스트

영어: Integration test

다른 이름: 통합 테스팅, 인티그레이션 테스트, integration testing, 결합 테스트

정의

서비스와 데이터베이스, 또는 두 API처럼 둘 이상의 컴포넌트가 실제 인터페이스를 통해 올바르게 함께 동작하는지 확인하는 테스트입니다.

통합 테스트(Integration test)는 하나의 컴포넌트 내부 로직이 아니라 컴포넌트 사이의 연결을 검증합니다. 적어도 하나의 경계에서 실제 구현을 사용합니다. 실제 데이터베이스를 대상으로 하는 리포지토리, 다른 서비스의 API를 호출하는 서비스, 메시지 생산자와 소비자 같은 경우입니다. 잘못된 SQL, 잘못된 직렬화, 누락된 설정, 맞지 않는 계약처럼 목(mock)을 쓰는 단위 테스트가 놓치는 문제를 잡아내는 것이 바로 이 테스트입니다.

예시

OrderRepository는 목으로 단위 테스트되었고 그 테스트는 통과합니다. 통합 테스트는 컨테이너로 띄운 실제 PostgreSQL 인스턴스를 대상으로 실행합니다.

  1. Testcontainers로 PostgreSQL을 시작하고 스키마 마이그레이션을 적용합니다.
  2. 리포지토리를 통해 품목 세 개가 있는 주문을 저장합니다.
  3. ID로 다시 불러와 합계와 품목이 일치하는지 어설션합니다.
  4. 날짜 범위로 주문을 조회하고 경계가 포함되는지 어설션합니다.

실제 데이터베이스로 실행하면 이 테스트는 컬럼 이름 오타, 적용되지 않은 마이그레이션, 시간대 변환 오류, 인메모리 데이터베이스에서는 동작하지만 PostgreSQL에서는 동작하지 않는 쿼리를 드러낼 수 있습니다.

통합 테스트, 단위 테스트, E2E 테스트 비교

단위 통합 E2E
범위 함수 또는 클래스 하나 몇 개의 컴포넌트와 그 인터페이스 사용자 관점의 시스템 전체
의존성 테스트 더블로 대체 테스트 대상 경계에서는 실제 모두 실제
속도 밀리초 초 초~분
실패가 가리키는 곳 특정 로직 특정 인터페이스 시스템 어딘가

접근 방식

  • **좁은 통합 테스트(narrow integration test)**는 한 번에 하나의 경계(서비스와 데이터베이스)만 확인하고 나머지는 스텁으로 대체합니다. 빠르고 정확하며, 대부분의 팀은 이런 테스트를 많이 원합니다.
  • **넓은 통합 테스트(broad integration test)**는 여러 실제 서비스를 함께 띄웁니다. 신뢰도는 더 높지만 느리고 진단이 어렵습니다.
  • 고전적인 교과서에서는 모듈을 결합하는 순서를 기준으로 빅뱅, 하향식(top-down), 상향식(bottom-up) 통합도 설명합니다. 면접에서는 이 용어를 알아 두면 도움이 되지만, 현대의 팀은 대부분 지속적으로 통합합니다.

흔한 실수

  • 오래 유지되는 데이터베이스 하나를 테스트와 개발자가 공유하기. 결과가 남은 데이터에 좌우됩니다. 실행마다 깨끗한 일회용 인스턴스를 쓰세요.
  • 테스트하려던 바로 그 경계를 목으로 대체하기. 그러면 통합 테스트가 다시 단위 테스트가 됩니다.

SDETRole 전체에서 검색할 내용을 입력하세요.

Pagefind 전문 검색 · 브라우저에서 실행됩니다 검색 페이지 열기 →