단일 동작 단위 검증
빠르게 수행
다른 테스트와 별도로 처리
위 요구 사항 중 하나라도 충족하지 못하는 테스트는 통합 테스트다.
단위 테스트가 아닌 모든 테스트가 통합 테스트다.
프로세스 외부 의존성과 통합해 어떻게 작동하는지를 검증한다.
통합 테스트는 유지비 증가, 회귀 방지가 단위테스트보다 우수하다.
제품 코드와의 결합도가 낮아 리팩터링 내성도 우수하다.
단위 테스트로 가능한 많은 시나리오의 예외 상황을 확인하고, 통합 테스트는 주요 흐름과 단위 테스트가 다루지 못하는 기타 예외 상황을 다룬다.
관리 의존성
애플리케이션을 통해서만 접근할 수 있다.
해당 의존성과의 상호 작용은 외부 환경에서 볼 수 없다.
데이터베이스가 대표적인 예다. 시스템은 DB에 직접 접근하지 않고 애플리케이션에서 제공하는 API를 통해 접근한다.
비관리 의존성
상호 작용을 외부에서 볼 수 있다.
SMTP 서버가 예다.
관리 의존성과의 통신은 구현 세부사항, 비관리 의존성과의 통신은 식별할 수 있는 동작이다.
관리 의존성은 실제 인스턴스를 사용, 비관리 의존성은 목으로 대체한다.
외부 클라이언트를 모방
모든 프로세스 외부 의존성을 참조하는 배포된 버전의 애플리케이션을 테스트한다.
통합 테스트를 위한 프로세스 외부 의존성은 관리 의존성 뿐이다.
외부 의존성을 추상화해 느슨한 결합도 유지
OCP 원칙 준수
단일 구현을 위한 인터페이스는 추상화가 아니다.
해당 인터페이스를 구현하는 구체 클래스보다 결합도가 낮지 않다.
진정으로 추상화 되려면 구현이 적어도 두 가지는 있어야 한다.
YAGNI(현재 필요하지 않은 기능에 시간을 들이지 말자)를 위반한다.
목을 사용하기 위함이다.
인터페이스가 없으면 테스트 대역을 만들 수 없다.
의존성을 목으로 처리 할 필요가 없는 한 인터페이스를 두지 말라 (구현체가 하나 일 경우)
로깅은 텍스트 파일이나 데이터베이스와 같은 프로세스 외부 의존성에 부작용을 일으킨다.
이러한 부작용을 고객이나, 클라이언트, 개발자 이외의 사람이 보는 경우라면 로깅은 식별할 수 있는 동작이므로 테스트 해야한다.
보는 이가 개발자 뿐이라면 구현 세부사항 이기 때문에 테스트해서는 안된다.
지원 로깅: 지원 담당자나 시스템 관리자가 추적할 수 있는 메시지를 생성
진단 로깅: 개발자가 애플리케이션 내부 상황을 파악할 수 있도록 돕는다.
비즈니스에 필요한 모든 지원 로깅을 명시적으로 나열하는 특별할 클래스를 만든다.
도메인 계층에 로깅 자제 (특히 진단 로깅)
로그 인스턴스는 메소드에 주입하는 방식을 권장
외부에서 볼 수 없는 의존성, 실제 인스턴스를 사용하여 테스트
__외부에서 볼 수 있는 의존성, 목(테스트 대역)으로 대체