Be-Developer

UnitTesting 07 가치있는 단위테스트를 위한 리팩터링

07 가치있는 단위테스트를 위한 리팩터링

리팩터링할 코드 식별하기

|복잡도 및 유의성 \ 협력자수 | low |high| |—|—|—| |high| 도메인 모델 및 알고리즘| 지나치게 복잡한 코드| |low|간단한 코드|컨트롤러|

  • 도메인 모델 및 알고리즘을 단위테스트하면 노력대비 가장 이롭다.
  • 간단한 코드는 테스트가치가 0에 가깝다.
  • 컨트롤러의 경우 포괄적인 통합테스트의 일부로서 간단한 테스트를 해야한다.
  • 지나치게 복잡한 코드를 알고리즘과 컨트롤러로 나누어 리팩토링하라.

    험블 객체 패턴

  • 험블 객체패턴은 지나치게 복잡한 코드에서 로직을 추출하여 코드를 테스트할 필요가 없도록 간단하게 만든다. 추출된 로직은 테스트하기 어려운 의존성에서 분리된 다른 클래스로 이동한다.

    가치있는 단위테스트를 위한 리팩터링

    1. 암시적 의존성을 명시적으로 만들기
    1. DB, 메시지 버스 등에 대한 인터페이스를 두고, sut에서 주입받게하여 mock으로 대체한다.
      1. 애플리케이션 서비스 계층 도입
      2. 애플리케이션 서비스 복잡도 낮추기
      3. 추상화

        최적의 단위테스트 커버리지 분석

  • 전제조건을 테스트해야하는가? : 일반적으로 도메인 유의성이 있는 모든 전제조건을 테스트하라.

    컨트롤러에서 조건부 로직 처리

    세가지 특성의 균형을 맞추어야한다. 세가지를 모두 충족시킬수는 없기때문에 두개 선택하자.

  • 도메인 모델 테스트 유의성 : 도메인 클래스의 협력자 수와 유형에 따른 함수
  • 컨트롤러 단순성 : 의사 결정지점이 있는지에 따라 다름.
  • 성능 : 프로세스 외부 의존성에 대한 호출 수

    canExecute/Execute 패턴사용, 컨트롤러 단순성

    컨트롤러는 자세한 프로세스를 알 필요가 없고, 여부만 확인하면 된다. canExecute 를 분기하는 if문을 테스트할 필요는 없다.

    도메인 이벤트를 사용해 모델 변경사항 추적

    도메인 이벤트는 컨트롤러에서 의사 결정 책임을 제거하고 해당 책임을 도메인 모델에 적용하여 테스트를 간결하게 한다.