<aside>
💡 8장에서 다루는 내용
- 통합 테스트의 역할 이해
- 테스트 피라미드의 개념 자세히 살펴보기
- 가치 있는 통합 테스트 작성
</aside>
8.1 통합 테스트는 무엇인가?
8.1.1 통합 테스트의 역할
- 2장에서 살펴봤듯이, 단위 테스트는 다음 세 가지 요구사항을 충족하는 테스트다.
- 단일 동작 단위를 검증하고
- 빠르게 수행하고
- 다른 테스트와 별도로 처리한다.
- 위 세 가지 요구 사항 중 하나라도 충족하지 못하는 테스트는 통합 테스트 범주에 속한다.
→ 단위 테스트가 아닌 모든 테스트가 통합 테스트에 해당한다.

그림 8.1 통합 테스트는 컨트롤러를 다루는 반면, 단위 테스트는 도메인 모델과 알고리즘을 다룬다.
- 통합 테스트는 대 부분 시스템이 프로세스 외부 의존성과 통합해 어떻게 작동하는지 검증한다.
- 7장에서 살펴봤듯이, 그림 8.1에서 간단한 코드와 지나치게 복잡한 코드는 테스트를 해서는 안된다.
8.1.2 다시 보는 테스트 피라미드
- 단위 테스트와 통합 테스트 간의 균형을 유지하는 것이 중요하다.
- 통합 테스트가 프로세스 외부 의존성에 직접 작동하면 느려지며, 유지비가 많이 든다.
- 유지비 증가 이유
- 프로세스 외부 의존성 운영이 필요함
- 관련된 협력자가 많아서 테스트가 비대해짐
- 통합 테스트는 코드를 많이 거치므로 회귀 방지가 단위 테스트보다 우수하다.
또한 제품 코드와의 결합도가 낮아 리팩터링 내성도 우수하다.

그림 8.2 테스트 피라미드는 대부분의 애플리케이션에 가장 적합한 절충안을 나태난다.
(2장에서 설명했듯이 엔드 투 엔드 테스트는 통합 테스트의 하위 집합이다.)
- 단위 테스트와 통합 테스트의 비율은 프로젝트 특성에 따라 다를 수 있지만, 단위 테스트로 가능한 한 많이 비즈니스 시나리오의 예외 상황을 확인하고, 통합 테스트는 주요 흐름(happy path)과 단위 테스트가 다루지 못하는 기타 예외 상황(edge case)을 다룬다.
주요 흐름은 시나리오의 성공적인 실행이다.
예외 상황은 비즈니스 시나리오 수행 중 오류가 발생하는 경우다.

그림 8.3 간단한 프로젝트의 테스트 피라미드
- 테스트 피라미드는 프로젝트의 복잡도에 따라 피라미드 대신 직사각형 모양이 될 수 있다. 또한 아주 단순한 경우라면 어떠한 단위 테스트도 없을 것이다.
8.1.3 통합 테스트와 빠른 실패