Effective UnitTest

좋은 단위 테스트의 특성은 아래와 같다.

  • 개발 주기에 통합돼 있다.
  • 실제로 사용하는 테스트에만 가치가 있다. 그렇지 않으면 작성해도 의미가 없다.
  • 코드베이스의 가장 중요한 부분만을 대상으로 한다.
  • 최소한의 유지비로 최대 가치를 끌어낸다.
  • 가치 있는 테스트를 작성해야 한다.
  • 유지 보수가 쉽다.
  • 가독성이 좋다.
  • 단위 테스트는 코드에서 버그를 찾는데 도움을 준다.

  • 단위 테스트는 코드 설계에서 문제를 찾는데 도움이 될 수 있다. 단위 테스트 설계가 어려운 코드, DI 를 사용하지 않고 전역 변수와 정적 함수를 많이 사용하고 결합성이 높은 코드라면 설계가 비합리적일 수 있음을 의심해야 한다.

  • 단위 테스트는 통합 테스트를 보완하는 강력한 도구다. 네트워크 타임 아웃, 일부 경계 조건 등 재현이 어려운 경우가 있다. 이 경우 MOCK 을 사용하여 비정상적인 상황을 재현하여 해당 상황에서의 코드 실행 결과를 테스트할 수 있다.

  • MOCK 은 코드가 외부 시스템, 데이터 베이스, 네트워크, 파일 시스템과 같이 제어할 수 없는 구성 요소에 종혹되는 경우, 이 종속 관계를 끊을 수 있도록 도와준다. MOCK 은 실제 서비스를 모의 서비스로 대체하는 것을 말한다. 단위 테스트를 작성하는 과정은 코드 리패터링 과정에 해당한다. 단위 테스트는 지속적인 리팩터링을 수행하는 효과적인 방법이다.

  • 단위 테스트는 정책 등의 문서화의 역할을 한다.

  • 단위 테스트는 TDD 를 개선하고 대체할 수 있다. TDD 는 실제로 거의 사용되지 않는 개발 방법론이다. 코드를 먼저 작성하고, 이에 맞춰 단위 테스트를 설계하고, 리팩터링 하는 개발프로세스가 더 친숙하고 프로그래머들이 쉽게 수용할 수 있다.

  • 단위 테스트는 코드의 구현 논리에 의존하지 않는다. 그 기능에만 초점을 맞춘다. 높은 커버리지를 추구하기 위해서 코드를 한줄 씩 따라가면서 구현 논리 자체에 대한 단위 테스트를 설계하는 경우, 외부적인 동작이 변경되지 않았음에도 코드의 구현 논리가 변경되었다면 단위 테스트가 실패하게 된다.

设计模式之美 / 王争