BottleH Blog

Unit Testing - 2장 단위 테스트란 무엇인가?

    Tags

  • Test
Unit Testing - 2장 단위 테스트란 무엇인가? thumbnail

고전파와 런던파를 구분짓는 정의는?

📖 2.1 단위 테스트의 정의


단위테스트의 속성

  • 작은 코드 조각(단위)을 검증
  • 빠르게 수행
  • 격리된 방식으로 처리하는 자동화된 테스트 ➡️ 런던파와 고전파를 구분할 수 있게 해주는 차이

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

  • 테스트 대상 시스템을 협력자에게서 격리하는 것을 일컫는다.
    • 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역으로 대체해야 한다.
    • 동작을 외부 영향과 분리해서 테스트 대상 클래스에만 집중할 수 있다.

장점

  1. 테스트가 실패하면 코드베이스의 어느 부분이 고장 났는지 확실히 알 수 있다.
    • 클래스의 모든 의존성이 테스트 대역으로 대체되어 확실히 알 수 있음.
  2. 객체 그래프(대상 클래스와 이 클래스를 의존하는 클래스)를 분할할 수 있다.
    • 클래스의 직접적인 의존성을 대체할 수 있고, 의존성의 의존성을 다룰 필요도 없다.
  3. 프로젝트 전반적으로 한 번에 한 클래스만 테스트하라는 지침을 도입하면 전체 단위 테스트 스위트를 간단한 구조로 할 수 있다.
    • 더 이상 코드베이스를 테스트하는 방법을 고민할 필요가 없다.

테스트 대역

  • 테스트 대역은 실행과 관련 없이 모든 종류의 가짜 의존성을 설명하는 포괄적인 용어다.
  • Mock은 그러한 의존성의 한 종류일 뿐이다.

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

  • 고전적인 방법에서 코드를 꼭 격리하는 방식으로 테스트해야 하는 것은 아니다.
  • 단위테스트는 서로 격리해서 실행해야 한다.
    • 어떤 순서로든 가장 적합한 방식으로 실행할 수 있으며 서로의 결과에 영향을 미치지 않는다.
  • 즉, 여러 클래스가 모두 메모리에 상주하고 공유 상태에 도달하지 않는 한, 여러 클래스를 한 번에 테스트해도 괜찮다는 뜻이다.
    • ex) 데이터베이스, 파일 시스템 등 프로세스 외부 의존성

공유 의존성

  • 테스트 간에 공유되고 서로의 결과에 영향을 미칠 수 있는 수단을 제공하는 의존성
  • 테스트 대상 클래스간이 아니라 단위 테스트 간에 공유

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


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

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

  • 고전파에서 교체 대상: 공유 의존성
  • 런던파에서 교체 대상: 협력자
    • 협력자: 공유하거나 변경 가능한 의존성
      • 데이터베이스는 공유 의존성이므로 데이터베이스 접근 권한을 제공하는 클래스는 협력자다.
      • 시간에 따라 상태가 변할 수 있기 때문에 협력자

📖 2.3 고전파와 런던파의 비교

런던파의 장점

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

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

좋은 코드 입자성을 목표로 하는 것은 도움이 되지 않는다. 즉, 테스트가 단일 동작 단위를 검증하는 한 좋은 테스트다.

우리집 강아지를 부르면, 바로 나에게 온다.

우리집 강아지를 부르면 먼저 왼쪽 앞다리를 움직이고, 이어서 오른쪽 앞다리를 움직이고...

위 예시처럼 실제 동작 대신 개별 클래스를 목표로 할 때 테스트가 이상하게 보인다.

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

실제 협력자를 대신해 목을 사용하면 클래스를 쉽게 테스트할 수 있다.

  • 특히, 의존성 그래프가 복잡하게 있을 때 쉽게 테스트 할 수 있다.

다만, 이것은 애초에 코드 설계 문제의 결과다.

  • 목을 사용하는 것은 이 문제를 감추기만 할 뿐, 원인을 해결하지 못한다.

🔖 2.3.3 버그 위치 정확히 찾아내기

버그발생시

  • 런던파: 버그가 포함된 테스트만 실패
  • 고전파: 전체 시스템에 걸쳐 테스트 실패를 야기하는 파급 효과를 초래
    • 다만, 마지막 수정 추적을 통해 금새 해결할 수 있고 고장난 코드 조각이 큰 가치를 지님을 알 수 있다.

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

  1. 런던파

    • 하향식 TDD
    • 시스템이 통신해야하는 협력자를 지정하여, 모든 클래스를 구현할 때까지 클래스 그래프를 다져간다.
      • Mock은 한 번에 한 클래스에 집중 할 수 있기 때문
    • 테스트가 구현에 더 자주 결합됨.
  2. 고전파

    • 상향식
    • 테스트가 구현에 덜 결합됨.

📖 2.4 두 분파의 통합 테스트

통합 테스트는 단위 테스트 기준 중 하나 이상을 충족하지 못하는 테스트다. 또한, 둘 이상의 동작 단위를 검증할 때의 테스트는 통합 테스트다.

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

E2E 테스트는 통합 테스트의 일부다. 통합테스트보다 일반적으로 의존성을 많이 포함한다.

  • 일반적으로 통합 테스트는 프로세스 외부 의존성을 한두 개만 갖고 작동한다.
  • E2E 테스트는 프로세스 외부 의존성을 전부 또는 대다수를 갖고 작동한다.
  • 유지보수 비용이 가장 많이 들기 때문에 단위 및 통합 테스트를 통과한 후 실행하는 것이 좋다.
Written by@BottleH
Back-End Developer

GitHub