테스트 더블

이승한·2020년 1월 6일
0
  1. 테스트 더블로 할 수 있는 일
  2. 테스트 더블의 종류
  3. 테스트 더블을 효율적으로 활용하기 위한 지침
  • 스텁
    • 예전의 의미 : 제품 코드가 온전히 준비되기 전까지 사용할 대용품
    • 테스트에서 의미 : 대상 코드를 격리하고, 속도를 개선하고, 예측 불가능한 요소를 제어하고, 특수한 상황을 시뮬레이션하고, 감춰진 정보를 얻어내는 용도

테스트 더블의 위력

  • 테스트 대상 코드와 협력 객체를 잘 분리
  • 테스트 전용 장치가 필요한 이유
    • 테스트 대상 코드를 격리한다. - 코드를 그 외의 모든 코드에서 떼어 놓는다.
    • 테스트 속도를 개선한다.
    • 예측 불가능한 실행 요소를 제거한다. - 결과에 영향을 주는 모든 요소를 결정적으로 만들기 위해서 이다.
    • 특수한 상황을 시뮬레이션 한다.
    • 감춰진 정보를 얻어낸다.

테스트 더블의 종류

  • 스텁 : 원래의 구현을 최대한 단순한 것으로 대체한다.
  • 가짜객체
    • 뒤끝없이 처리한다
    • 진짜 객체의 행동을 흉내낸다.
    • 진짜 객체를 사용할 때 생기는 부수 효과, 연쇄 동작이 일어나지 않도음
    • 경량화 하고 최적화 한것
  • 스파이 : 목격한 일을 기록해 두었다가 나중에 테스트가 확인 할 수 있게 한다.
  • Mock
    • 예기치 않은 일이 발생하면 바로 실패한다. (예상보다 많이 발생하거나, 적게 발생하거나, 발생하지 않거나)
    • 특수한 형태의 테스트 스파이다.
    • 특정 조건이 발생하면 미리 약속된 행동을 취한다. (고급진 Stub)

테스트 더블 활용 지침

용도에 맞는 도구를 써야 한다.

  • 용도에 맞는 더블을 선택하라. 가장 읽기 쉽게 만들어주는 선택을 하라.
  • Stub 은 질문하고 Mock 은 행동한다.

준비하고, 시작하고, 단언하라

  • 준비-시작-단언 (AAA, arrange-act-assert)
  • Given, When, Then (주어진 상황에서 어떤 일이 발생했을 때, 특정 결과를 기다린다)
  • 세 영역중 하나가 비대하다고 느껴진다면, 너무 많은 것을 한꺼번에 검사하는 테스트일 가능성이 높다.

구현이 아닌 동작을 테스트 하라

  • 지극히 사소한 변경 마저도 테스트를 실패하게 하면 안된다.
  • 테스트는 오직 한가지만 검사해야 하고, 그 의도를 명확히 전달하도록 작성되어야 한다.
  • 구현이 아니라 동ㅇ작을 검증하자.

도구선택

  • Mockito 는 stubbing 과 Verification 을 구분한다.
  • Jmock 은 테스트 더블의 대상 코드가 그 어떤 것도 자기 마음대로 호출하면 안된다고 믿는다.
  • Mockito 는 대상 코드가 언젠건 아무것이나 호출해도 된다고 믿는다.

종속 객체를 주입하라

  • 종속 객체들을 PrivateMethod 에 저장하거나, 팩토리 메서드 등을 통해서 외부로 부터 얻도록 해야 한다.
  • private 을 public 이나 default 로 변경하는 것은 옳지 않다.
  • 종속 객체 주입법을 사용하라. (생성자 주입을 애용하자)
profile
software develop engineer

0개의 댓글