[tdd] 인수테스트, 단위테스트, 통합테스트, 전 구간 테스트

테스트 주도 개발로 배우는 객체지향 설계와 실천 이라는 책과 Acceptance Test vs Integration Test 블로그의 글을 합쳐서 작성한 각 테스트들의 종류와 특징이다.

유닛 테스트(Unit Test)

  • 가장 작은 단위의 테스트이다
  • 보통 메서드 레벨이다
  • A라는 함수가 실행되면 B라는 결과가 나온다 정도로 테스트한다
  • 즉각적인 피드백이 나온다는 것이 훌륭한 장점이다
  • 꼭 메모리 내에서만 실행되는 테스트여야 한다는 법칙은 없다
    • 데이터베이스, 네트워크 엑세스, 파일 시스템 등을 사용하여도 단위테스트의 레벨일 수 있다
  • 테스트하기 어려운 부분은 stub을 사용하여 테스트한다
    • 비용이 크지 않다면 stub보다는 실제 객체를 사용하는 것이 좋다
    • 아무래도 정교한 목 객체가 실제 객체보다 정확하지는 않기 때문이다
    • 모든 것은 비용 관점에서 생각해야 한다
  • 하나의 메서드들이 잘 동작한다는 것은 보장할 수 있지만, 그들이 결합되었을때도 잘 작동한다는 것은 보장할 수 없다

전 구간 테스트(End-To-End Test)

  • 해당 시스템과 해당 시스템을 구축하고 배포하는 프로세스를 모두 시험하는 것을 말한다
    • 용어를 사용하는 곳마다 조금씩 차이가 있다
  • 내부 기능들까지(클래스의 메서드들까지) 테스트 할 필요는 없다
    • 이는 단위테스트의 영역이다
  • 단점은 테스트를 만들기가 힘들고, 만든 테스트를 신뢰하기도 힘들다는 것이다

통합 테스트(Integration Test)

  • 기본적으로 여러개를 통합해서 테스트 할때 사용하는데, 뭔가 정확한 용어가 정의된 느낌은 아니다
  • 책에서는 변경할 수 없는 부분(외부 라이브러리 등)까지 묶어서 같이 테스트 할 떄 사용한다고 말하고 있다
  • 사용하는 곳에서 어떻게 사용하는 가에 따라 다른 것 같다
  • 그래서 난 사용하지 않을 것이다

인수 테스트(Acceptance Test)

  • 단위 테스트, 전 구간 테스트, 통합 테스트와는 약간 scope 가 다르다
    • 위의 3가지는 초점이 기술 쪽이라면, 인수 테스트는 초점이 비즈니스 쪽이다
  • 구현하고자 하는 기능(비즈니스 레벨)에 대한 테스트이다
  • 대체적으로 전 구간 테스트를 사용하여 기능을 테스트한다
    • 그래서 이를 동일하게 얘기하는 곳도 많다
  • 하지만 결과적으론, 위 3가지 모두 인수테스트의 범위에 들어갈 수 있다
    • 보험금액을 계산하는 어플리케이션에서는 보험금액을 계산하는 메서드 단위 테스트가 인수테스트가 될 수 있다