07 가치있는 단위테스트를 위한 리팩터링
리팩터링할 코드 식별하기
|복잡도 및 유의성 \ 협력자수 | low |high| |—|—|—| |high| 도메인 모델 및 알고리즘| 지나치게 복잡한 코드| |low|간단한 코드|컨트롤러|
- 도메인 모델 및 알고리즘을 단위테스트하면 노력대비 가장 이롭다.
- 간단한 코드는 테스트가치가 0에 가깝다.
- 컨트롤러의 경우 포괄적인 통합테스트의 일부로서 간단한 테스트를 해야한다.
- 지나치게 복잡한 코드를 알고리즘과 컨트롤러로 나누어 리팩토링하라.
험블 객체 패턴
- 험블 객체패턴은 지나치게 복잡한 코드에서 로직을 추출하여 코드를 테스트할 필요가 없도록 간단하게 만든다. 추출된 로직은 테스트하기 어려운 의존성에서 분리된 다른 클래스로 이동한다.
가치있는 단위테스트를 위한 리팩터링
- 암시적 의존성을 명시적으로 만들기
- DB, 메시지 버스 등에 대한 인터페이스를 두고, sut에서 주입받게하여 mock으로 대체한다.
- 애플리케이션 서비스 계층 도입
- 애플리케이션 서비스 복잡도 낮추기
- 추상화
최적의 단위테스트 커버리지 분석
- 전제조건을 테스트해야하는가? : 일반적으로 도메인 유의성이 있는 모든 전제조건을 테스트하라.
컨트롤러에서 조건부 로직 처리
세가지 특성의 균형을 맞추어야한다. 세가지를 모두 충족시킬수는 없기때문에 두개 선택하자.
- 도메인 모델 테스트 유의성 : 도메인 클래스의 협력자 수와 유형에 따른 함수
- 컨트롤러 단순성 : 의사 결정지점이 있는지에 따라 다름.
- 성능 : 프로세스 외부 의존성에 대한 호출 수
canExecute/Execute 패턴사용, 컨트롤러 단순성
컨트롤러는 자세한 프로세스를 알 필요가 없고, 여부만 확인하면 된다. canExecute 를 분기하는 if문을 테스트할 필요는 없다.
도메인 이벤트를 사용해 모델 변경사항 추적
도메인 이벤트는 컨트롤러에서 의사 결정 책임을 제거하고 해당 책임을 도메인 모델에 적용하여 테스트를 간결하게 한다.