통합 테스트

theonde·2022년 12월 11일

단위 테스트의 세 가지 요구 사항

  1. 단일 동작 단위 검증

  2. 빠르게 수행

  3. 다른 테스트와 별도로 처리

위 요구 사항 중 하나라도 충족하지 못하는 테스트는 통합 테스트다.

단위 테스트가 아닌 모든 테스트가 통합 테스트다.

  • 프로세스 외부 의존성과 통합해 어떻게 작동하는지를 검증한다.

  • 통합 테스트는 유지비 증가, 회귀 방지가 단위테스트보다 우수하다.

  • 제품 코드와의 결합도가 낮아 리팩터링 내성도 우수하다.

  • 단위 테스트로 가능한 많은 시나리오의 예외 상황을 확인하고, 통합 테스트는 주요 흐름과 단위 테스트가 다루지 못하는 기타 예외 상황을 다룬다.

프로세스 외부 의존성의 두 가지 유형

  • 관리 의존성

    • 애플리케이션을 통해서만 접근할 수 있다.

    • 해당 의존성과의 상호 작용은 외부 환경에서 볼 수 없다.

    • 데이터베이스가 대표적인 예다. 시스템은 DB에 직접 접근하지 않고 애플리케이션에서 제공하는 API를 통해 접근한다.

  • 비관리 의존성

    • 상호 작용을 외부에서 볼 수 있다.

    • SMTP 서버가 예다.

  • 관리 의존성과의 통신은 구현 세부사항, 비관리 의존성과의 통신은 식별할 수 있는 동작이다.

관리 의존성은 실제 인스턴스를 사용, 비관리 의존성은 목으로 대체한다.

엔드 투 엔드 테스트

  • 외부 클라이언트를 모방

  • 모든 프로세스 외부 의존성을 참조하는 배포된 버전의 애플리케이션을 테스트한다.

  • 통합 테스트를 위한 프로세스 외부 의존성은 관리 의존성 뿐이다.

인터페이스 추상화

인터페이스를 사용하는 이유에 대한 오해

  1. 외부 의존성을 추상화해 느슨한 결합도 유지

  2. OCP 원칙 준수

위 두가지 이유 모두 오해다.

  • 단일 구현을 위한 인터페이스는 추상화가 아니다.

  • 해당 인터페이스를 구현하는 구체 클래스보다 결합도가 낮지 않다.

  • 진정으로 추상화 되려면 구현이 적어도 두 가지는 있어야 한다.

  • YAGNI(현재 필요하지 않은 기능에 시간을 들이지 말자)를 위반한다.

인터페이스를 사용하는 진짜 이유

  • 목을 사용하기 위함이다.

  • 인터페이스가 없으면 테스트 대역을 만들 수 없다.

  • 의존성을 목으로 처리 할 필요가 없는 한 인터페이스를 두지 말라 (구현체가 하나 일 경우)

계층 수 줄이기

  • 도메인 모델, 애플리케이션 서비스 계층, 인프라 계층 세 가지만 활용하자.

로깅 테스트

  • 로깅은 텍스트 파일이나 데이터베이스와 같은 프로세스 외부 의존성에 부작용을 일으킨다.

  • 이러한 부작용을 고객이나, 클라이언트, 개발자 이외의 사람이 보는 경우라면 로깅은 식별할 수 있는 동작이므로 테스트 해야한다.

  • 보는 이가 개발자 뿐이라면 구현 세부사항 이기 때문에 테스트해서는 안된다.

  • 지원 로깅: 지원 담당자나 시스템 관리자가 추적할 수 있는 메시지를 생성

  • 진단 로깅: 개발자가 애플리케이션 내부 상황을 파악할 수 있도록 돕는다.

  • 비즈니스에 필요한 모든 지원 로깅을 명시적으로 나열하는 특별할 클래스를 만든다.

  • 도메인 계층에 로깅 자제 (특히 진단 로깅)

  • 로그 인스턴스는 메소드에 주입하는 방식을 권장

관리 의존성 -> 구현 세부사항

외부에서 볼 수 없는 의존성, 실제 인스턴스를 사용하여 테스트

비관리 의존성 -> 식별할 수 있는 동작

__외부에서 볼 수 있는 의존성, 목(테스트 대역)으로 대체

profile
개발자ㅋ.ㅋ

0개의 댓글