반응형
목의 가치를 극대화하기
비관리 의존성에만 목을 사용하는 것은 목의 가치를 극대화 하는 첫번째 단계일 뿐이다.
목을 사용할 때는 꼭 **시스템 끝에서 비관리 의존성과의 상호 작용**을 검증하라!!
IBus 는 시스템 끝에 있다. IMessgeBus는 컨트롤러와 메시지 버스 타입 사슬에서 중간 고리일 뿐이다. IMessageBus 대신 IBus를 목으로 처리하면 회귀 방지가 좋아진다.
목 처리에 대한 모범 사례
- 비관리 의존성(외부 시스템)에만 목 적용하기
- 시스템 끝에 있는 의존성에 대해 상호 작용 검증하기
- 목은 통합 테스트만을 위한 것이다.
- 도메인 모델(persistance Layer) 은 단위 테스트 범주에 속하고, 컨트롤러를 다루는 테스트(presentation Layer)는 통합 테스트다.
- 테스트당 목이 하나일 필요는 없다.
- 호출 횟수 검증하기
- 예상하는 호출이 있는가?
- 예상치 못한 호출이 있는가?
- 호출 횟수 검증하기
messageBusMock.Verfiy(x => x.SendEmailChangeMessage(user.UserId, "new@gmail.com"));
// 메시지를 전송하는지 확인하는 것만으로 충분하지 않다.
// 아래와 같이 메시지가 정확히 한 번만 전송되는지 확인해야 한다.
messageBusMock.Verfiy(x => x.SendEmailChangeMessage(user.UserId, "new@gmail.com"), Times.Once); // <- 해당 메서드를 한 번만 호출하는지 확인
보유 타입만 목으로 처리하기
서드파티 라이브러리 위에 항상 어댑터를 작성하고, 기본 타입 대신 해당 어댑터를 목으로 처리해야 한다.
- 서드파티 코드의 작동 방식에 대해 깊이 이해하지 못한 경우가 많다.
- 서드파티 코드의 기술 세부 사항까지는 꼭 필요하지 않기에 어댑터는 이를 추상화하고, 애플리케이션 관점에서 라이브러리와의 관계를 정의한다.
실제로 어댑터는 코드와 외부 환경 사이에 손상 방지 계층으로 작동한다.
- 기본 라이브러리의 복잡성을 추상화하고
- 라이브러리에서 필요한 기능만 노출하며
- 프로젝트 도메인 언어를 사용해 수행할 수 있다.
- 또한 이렇게 추상 계층을 중간에 둠으로써 이러한 파급 효과를 하나의 클래스(어댑터)로 제한할 수 있다.
참조
- 단위테스트(블라디미르 크리코프)
반응형
'테스트코드 > 개요' 카테고리의 다른 글
11. 단위 테스트 안티 패턴 (0) | 2024.03.25 |
---|---|
10. 데이터베이스 테스트 (0) | 2024.03.25 |
8. 통합 테스트를 하는 이유 (0) | 2024.03.25 |
7. 가치 있는 단위 테스트를 위한 리팩토링 (0) | 2024.03.25 |
6. 단위 테스트 스타일 (0) | 2024.03.25 |