2장. 단위 테스트란 무엇인가

2장. 단위 테스트란 무엇인가

고전파(classical school)는 단위 테스트와 테스트 주도 개발에 원론적으로 접근하는 방식

런던파(London school)는 단위 테스트와 테스트 주도 개발에 실용적으로 접근하는 방식

‘단위 테스트’의 정의

단위 테스트의 속성

  • 작은 코드 조각을 검증하고
  • 빠르게 수행하고
  • 격리된 방식으로 처리하는 자동화된 테스트다

세번째에서 논란의 여지가 있는데 격리된 방식에 차이가 런던파와 고전파의 차이다.

격리 문제에 대한 런던파의 접근

테스트 대상 시스템을 협력자에게서 격리하는 것을 말한다. 즉 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역으로 대체해야 된다

장점

  • 단위 테스트를 의존성과 별개로 수행할수 있다
  • 테스트가 실패하면 코드베이스의 어느 부분이 고장 났는지 확실히 알수 있다
  • 객체 그래프를 분할할 수 있다

격리 문제에 대한 고전파의 접근

테스트는 서로 격리해서 실행해야 한다

  • 공유 의존성(shared dependency) : 테스트 간에 공유되고 서로의 결과에 영향을 미칠 수 있는 수단을 제공하는 의존성
  • 비공개 의존성(private dependency) : 공유하지 않은 의존성
  • 프로세스 외부 의존성(out of process dependency) : 애플리케이션 실행 프로세스 외부에서 실행되는 의존성

결리 문제에 대한 이러한 해석에는 목과 기타 테스트 대역을 적당히 쓰려는 견해가 있다

공유의존성은 테스트 대상 클래스 간이 아니라 단위 테스트 간에 공유한다
테스트 실행 속도를 높이기 의해 공유의존성을 대체한다

단위 테스트의 런던파와 고전파

격리주체 단위의 크기 테스트 대역 사용 대상
런던파 단위 단일 클래스 불변의존성 외 모든 의존성
고전파 단위테스트 단일 클래스 또는 클래스 세트 공유 의존성

고전파와 런던파가 의존성을 다루는 방법

테스트 대역을 어디에서나 흔히 사용할수 있지만 런던파는 테스트에서 일부 의존성을 그대로 사용할 수 있도록 하고 있다

  • 협력자(collaborator) : 공유하거나 변경 가능한 의존성
  • 의존성 : 일반적인 클래스는 두가지 유형의 의존성으로 동작한다 협력자, 값

고전파와 런던파 비교

코전파와 런던파 간의 주요 차이는 단위 테스트의 정의에서 격리 문제를 어떻게 다루는지에 있다

런던파의 장점

  • 입자성이 좋다. 테스트가 세밀해서 한번에 한 클래스만 확인한다
  • 서로 연결된 클래스의 그래프가 커져도 테스트하기 쉽다
  • 테스트가 실패하면 어떤 기능이 실패했는지 확실히 알수 있다

한 번에 한 클래스만 테스트하기

좋은 입자성이란 단위 테스트에서 단위를 구성하는 것에 대한 논쟁

런던파는 클래스를 단위로 간주한다

상호 연결된 클래스의 큰 그래프를 단위 테스트하기

실제 협력자를 대신해 목을 사용하면 클래스를 쉽게 테스트할 수 있다.
상호 연결된 클래스의 크고 복잡한 그래프를 테스트할 방법을 찾는 대신 이러한 클래스 그래프를 갖지 않는 데 집중해야 한다.
대개 클래스 그래프가 커진 것은 코드 설계 문제이다

버그 위치 정확히 찾아내기

테스트를 정기적으로 실행하면 버그의 원인을 알아낼 수 있다
마지막으로 한 수정이 무엇인지 알기 때문에 문제를 찾는 것은 어렵지 않다

계단식 실패를 통해 방금 고장 낸 코드 조각이 큰가치가 있다는것을 알게 된다 -> 전체 시스템이 그것에 의존한다

고전파와 런던파 사이의 다른 차이점

고전파와 런던파 사이에 남아 있는 두가지 차이점

  • 테스트 주도 개발을 통한 시스템 설계 방식
  • 과도한 명세 문제

런던 스타일의 단위 테스트는 하양식 TDD로 이어지며 전체 시스템에 대한 기대치를 설정하는 상위 레벨 테스트 부터 시작한다

고전파는 테스트에서 실제 객체를 다뤄야 하기 때문에 지침을 똑같이 두지 않는다. 대신 일반적으로 상향식으로 한다

두 분파의 통합 테스트

런던파는 실제 협력자 객체를 사용하는 모든 테스트를 통합 테스트로 간주한다

고전 스타일로 작성된 대부분의 테스트는 런던파에게 통합테스트로 느껴질 것이다

통합 테스트의 일부인 엔드 투 엔드 테스트

엔드투 앤드 테스트는 통합 테스트의 일부이다

엔드투 앤드 테스트는 유지 보수 측면에서 가장 비용이 많이 들기 때문에 모든 단위 테스트와 통합 테스트를 통과후 빌드 프로세스 후반에 실행하는 것이 좋다

참조