블라디미르 코리코프 님의 "단위 테스트" 책을 정리한 포스팅입니다.
3. 목과 테스트 취약성 간의 관계
육각형 아키텍처
도메인
- 애플리케이션의 중심부.
- 비즈니스 로직이 포함되어 있음.
애플리케이션 서비스
- 도메인 계층 위에 있음
- 외부 환경과의 통신을 조정함
- 도메인 클래스와 프로세스 외부 의존성 간의 작업을 조정함
계층간의 관심사 분리
- 전형적인 애플리케이션은 도메인과 애플리케이션 서비스라는 두 계층으로 구성됨
- 책임을 변환하여 알맞게 책임질 수 있도록 하기
단방향 통신
- 애플리케이션 서비스 계층에서 도메인 계층으로 흐르는 의존성 흐름을 규정함
- 애플리케이션 서비스 계층은 도메인 계층에 대해 알고 있음
- 도메인 계층은 외부 환경으로부터 완전히 격리됨
프렉탈
- 전체와 부분이 동일한 패턴이나 구조를 가진다는 개념
- 계층마다 동일한 테스트 목표를 유지 (비즈니스 요구사항 중심)
- 계층별 독립성을 유지
- 장점
- 테스트가 비즈니스 요구사항으로 연결됨 (추적성)
- 테스트의 구조가 일관되어 유지보수와 가독성에 도움이 됨
시스템 내부 통신과 시스템 간 통신
시스템 내부 통신
- 애플리케이션 내 클래스 간의 통신
- 구현 세부 사항에 해당됨
- 식별할 수 있는 동작이 아님
- 클라이언트의 목표와 직접적인 관계가 없음
- 중간 단계를 맡고 있음
- 별도 애플리케이션과 함께 성장하는 방식
- 하위 호환성이 지켜져야 함
시스템 간 통신
- 해당 시스템의 식별할 수 있는 동작을 나타냄 (계약)
- 외부 애플리케이션과 통신할 때 사용하는 통신 패턴은 항상 외부 애플리케이션이 이해할 수 있도록 유지되어야 함
4. 단위 테스트의 고전파와 런던파 재고
런던파
- 불변 의존성을 제외한 모든 의존성에 목 사용 권장
- 시스템 내 통신과 시스템 간 통신을 구분하지 않음
단점
- 목을 무분별하게 사용하면, 구현 세부 사항에 결합돼 테스트에 리팩터링 내성이 사라지게 됨
고전파
- 공유 의존성을 피할 것을 권고함
- 테스트가 실행 컨텍스트를 서로 방해하여, 병렬 처리를 할 수 없게 하기 때문
모든 프로세스 외부 의존성을 목으로 해야 하는 것은 아니다
의존성 유형
- 공유 의존성: 테스트 간에 공유하는 의존성
- 프로세스 외부 의존성: 실행 프로세스 외에 다른 프로세스를 점유하는 의존성
- 비공개 의존성: 공유하지 않는 모든 의존성
외부 의존성과의 통신은 구현 세부사항이다
- 통신패턴이 변경되더라도, 비즈니스 요구사항은 영향을 받지 않아야 함
- 통신패턴이 애플리케이션 내부적으로 변경될 수 있음
- 즉, 목으로 검증해서는 안됨 (리팩토링 내성)
외부 시스템과 통신하는 패턴이 비즈니스 요구사항으로 지정되어 있는 경우
- 외부 의존성과의 통신이 하위 호환성을 유지해야 함
- 이러한 경우, 통합 테스트가 적절함
외부 의존성과의 통신이 내부 애플리케이션에서 프록시로 수행될 경우
- 외부 통신패턴이 클라이언트에 노출되지 않음
- 따라서 외부 통신패턴 방식은 비즈니스 요구사항과 무관하게 내부 구현 세부사항이 됨
- 즉, 테스트로 검증할 필요가 없어짐
외부 의존성이 독립적인 시스템일 경우
- 의존성의 컨디션이 달라지면 목으로 테스트할 경우 깨지기 쉬운 테스트가 됨
- 실제 시스템에 대한 통합 테스트를 수행해야 함
목을 사용한 동작 검증
- 중요한 것은 클라이언트 목표로 거슬러 올라갈 수 있는 동작
- 클라이언트에게 중요한 것은 도움뿐
- 목은 애플리케이션의 경계를 넘나드는 상호 작용을 검증할 때와 상호 작용의 부작용을 검증할 때 사용하는 것이 적절함
'Code' 카테고리의 다른 글
[단위 테스트] 6-1. 단위 테스트 스타일: 단위 테스트 스타일 (0) | 2025.01.25 |
---|---|
[단위 테스트] 5-1. 목과 테스트 취약성: 목 (0) | 2025.01.24 |
[단위 테스트] 4-2. 좋은 단위 테스트의 4대 요소: 이상적인 테스트 (0) | 2025.01.24 |
[단위 테스트] 4-1. 좋은 단위 테스트의 4대 요소: 4대 요소 (0) | 2025.01.19 |
[단위 테스트] 3. 단위 테스트 구조 (0) | 2025.01.07 |