Code

[단위 테스트] 5-2. 목과 테스트 취약성: 통신

noahkim_ 2025. 1. 24. 21:53

블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.


3. 목과 테스트 취약성 간의 관계

육각형 아키텍처

도메인
  • 애플리케이션의 중심부.
  • 비즈니스 로직이 포함되어 있음.

 

애플리케이션 서비스
  • 도메인 계층 위에 있음
  • 외부 환경과의 통신을 조정함
    • 도메인 클래스와 프로세스 외부 의존성 간의 작업을 조정함

 

계층간의 관심사 분리
  • 전형적인 애플리케이션은 도메인과 애플리케이션 서비스라는 두 계층으로 구성됨
  • 책임을 변환하여 알맞게 책임질 수 있도록 하기

 

단방향 통신
  • 애플리케이션 서비스 계층에서 도메인 계층으로 흐르는 의존성 흐름을 규정함
  • 애플리케이션 서비스 계층은 도메인 계층에 대해 알고 있음
  • 도메인 계층은 외부 환경으로부터 완전히 격리됨

 

프렉탈
  • 전체와 부분이 동일한 패턴이나 구조를 가진다는 개념
    • 계층마다 동일한 테스트 목표를 유지 (비즈니스 요구사항 중심)
    • 계층별 독립성을 유지
  • 장점
    • 테스트가 비즈니스 요구사항으로 연결됨 (추적성)
    • 테스트의 구조가 일관되어 유지보수와 가독성에 도움이 됨

 

시스템 내부 통신과 시스템 간 통신

시스템 내부 통신
  • 애플리케이션 내 클래스 간의 통신
  • 구현 세부 사항에 해당됨
    • 식별할 수 있는 동작이 아님
    • 클라이언트의 목표와 직접적인 관계가 없음
    • 중간 단계를 맡고 있음
  • 별도 애플리케이션과 함께 성장하는 방식
    • 하위 호환성이 지켜져야 함

 

시스템 간 통신
  • 해당 시스템의 식별할 수 있는 동작을 나타냄 (계약)
  • 외부 애플리케이션과 통신할 때 사용하는 통신 패턴은 항상 외부 애플리케이션이 이해할 수 있도록 유지되어야 함

 

4. 단위 테스트의 고전파와 런던파 재고

런던파

  • 불변 의존성을 제외한 모든 의존성에 목 사용 권장
  • 시스템 내 통신과 시스템 간 통신을 구분하지 않음

 

단점
  • 목을 무분별하게 사용하면, 구현 세부 사항에 결합돼 테스트에 리팩터링 내성이 사라지게 됨

 

고전파

  • 공유 의존성을 피할 것을 권고함
  • 테스트가 실행 컨텍스트를 서로 방해하여, 병렬 처리를 할 수 없게 하기 때문

 

모든 프로세스 외부 의존성을 목으로 해야 하는 것은 아니다

의존성 유형
  • 공유 의존성: 테스트 간에 공유하는 의존성
  • 프로세스 외부 의존성: 실행 프로세스 외에 다른 프로세스를 점유하는 의존성
  • 비공개 의존성: 공유하지 않는 모든 의존성

 

외부 의존성과의 통신은 구현 세부사항이다
  • 통신패턴이 변경되더라도, 비즈니스 요구사항은 영향을 받지 않아야 함
  • 통신패턴이 애플리케이션 내부적으로 변경될 수 있음
  • 즉, 목으로 검증해서는 안됨 (리팩토링 내성)

 

외부 시스템과 통신하는 패턴이 비즈니스 요구사항으로 지정되어 있는 경우
  • 외부 의존성과의 통신이 하위 호환성을 유지해야 함
  • 이러한 경우, 통합 테스트가 적절함

 

외부 의존성과의 통신이 내부 애플리케이션에서 프록시로 수행될 경우
  • 외부 통신패턴이 클라이언트에 노출되지 않음
  • 따라서 외부 통신패턴 방식은 비즈니스 요구사항과 무관하게 내부 구현 세부사항이 됨
  • 즉, 테스트로 검증할 필요가 없어짐

 

외부 의존성이 독립적인 시스템일 경우
  • 의존성의 컨디션이 달라지면 목으로 테스트할 경우 깨지기 쉬운 테스트가 됨
  • 실제 시스템에 대한 통합 테스트를 수행해야 함

 

목을 사용한 동작 검증

  • 중요한 것은 클라이언트 목표로 거슬러 올라갈 수 있는 동작
    • 클라이언트에게 중요한 것은 도움뿐
  • 목은 애플리케이션의 경계를 넘나드는 상호 작용을 검증할 때와 상호 작용의 부작용을 검증할 때 사용하는 것이 적절함