단위테스트

단위 테스트? 고전파,런던파?

단위테스트에 대해 알아보고 고전파와 런던파의 차이를 알아보자


단위 테스트(Unit test)는 가장 작은 단위의 테스트로 일반적으로 메서드 레벨에서 테스트 하는 것을 의미한다

  • 이제는 누구나 단위테스트를 적용한다. 이에 대한 이견은 없으나 이제는 이 단계를 넘어서 좋은 단위 테스트를 작성하는 것은 어떤 의미인가?로 논쟁이 진행되고 있다.
  • 좋은 테스트를 작성하지 못하면 오히려 테스트가 상황을 더 안좋게 만들수도 있다
  • 그렇기 때문에 단위테스트를 어떻게 잘 짤수 있을까라는 것은 매우 중요하다

단위 테스트의 목표

우선 단위 테스트의 목표에 대해 알아보자 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것이다.

프로젝트는 처음에는 빠른 성장을 한다. 하지만 시간이 지날수록 이정도의 속도로 계속 성장하기는 어렵다 image

테스트가 없는 프로젝트는 처음에는 발목을 잡을 것이 없으므로 빠른 시작이 가능하다. 하지만 시간이 지날수록 점점 더 많은 시간을 들여야 처음에 보여준 것과 같은 정도의 진척을 낼 수 있다.

하나의 버그를 수정하니까 더 많은 버그를 양산하고, 한 부분을 수정하면 다른 부분이 고장이 나는 등 도미노 현상이 일어 난다.

하지만 테스트가 있다면 안전망 역할을 한다. 테스트는 새로운 기능을 도입하거나 새로운 요구 사항에 더 잘 맞게 리팩터링한 후에도 기존 기능이 잘 작동하는지 확인하는 데 도움이 된다. => 그래서 초반에 상당한 노력이 든다. 하지만 장기적으로는 절대 큰 비용이아니다

지속성, 확장성 => 장기적으로 개발 속도를 유지

코드 커버리지

  • 코드 커버리지가 너무 적을 때는 테스트가 충분하지 않다는 증거이다. 하지만 반대에경우 100% 커버리지라고 해서 반드시 좋은 테스트라고 보장하지는 않는다

    커버리지 : 일련의 테스트 작업 중 테스트가 전체 테스트를 해야하는 부분중에서 얼마만큼을 테스트 했는지를 판단해야 하는데 테스트가 전체 소스코드중에서 얼마나를 커버했는지를 나타낸 비율


좋은 테스트와 좋지 않은 테스트를 가르는 요인

테스트가 프로젝트 성장에 도움이 되는 것은 맞지만, 테스트를 작성하는 것만으로는 충분하지 않다 ⇒ 좋은 테스트를 작성해야 한다

FIRST 법칙

  • F : Fast(빠르게) - 테스트는 빨라야한다 한 테스트가 너무 오래걸리면 안된다
  • I : Independent(독립적으로) - 각각의 테스트는 서로 의존하면 안된다 => 도미노처럼 잇다라 실패할수 있음
  • R : Repeatable(반복 가능하게) - 어떤 환경에서도 테스트가 가능해야한다
  • S : Self-Validating(자가 검증하는) - 테스트가 스스로 참 거짓을 판단해야지 사람이 주관적으로 판단해서는 안된다
  • T : Timely(적시에) - 테스트는 나중에 작성해야지 이런식으로 하면 안된다. 테스트를 미리작성하고 실제 코드를 구현해야 한다.

단위 테스트란?

  1. 작은 코드 조각(단위)를 검증하고
  2. 빠르게 수행하고
  3. 격리된 방식으로 처리하는 자동화된 테스트

고전파, 런던파

사람들의 의견이 나뉘는 부분은 3번째 부분이다. 격리가 정확히 뭘말하는 걸까? 에서 시작된 논쟁이다.

런던파는 이 코드조각을 격리된 방식으로 검증한다는 것은 테스트 대상 시스템협력자에게서 격리하는 것을 의미 한다고 봤다=> 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역으로 대체해야 한다 image

image

런던파의 이점

  1. 테스트가 실패하면 코드베이스의 어느 부분이 고장났는지 확실히 알 수 있음 (테스트 대상 시스템)
  2. 객체 그래프를 분할할 수 있다.
    • 하나의 클래스가 여러 클래스에 의존할수 있고 각각의 클래스가 다른 클래스에 의존할 수 있으니 객체 그래프가 상당히 복잡해지는데 이를 분할할 수 있다.

런던파 고전파 비교

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

  • 런던파는 테스트 대상 단위를 서로 분리해야 한다고 생각.(클래스 단위로) 불변 의존성(enum)을 제외한 모든 클래스는 대역으로 대체해야한다
  • 고전파는 단위가 아니라 단위 테스트를 서로 분리해야 한다고 한다. 또한 테스트 대상 단위는 코드 단위가 아니라 동작 단위