ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2장 - 단위 테스트란 무엇인가?
    테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 6. 14. 00:01

    2장에서 다루는 내용

    • 단위 테스트란?
    • 공유 의존성, 비공개 의존성, 휘발성 의존성 간의 차이점
    • 단위 테스트의 두 분파: 고전파와 런던파
    • 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트의 차이점

     

    단위 테스트의 정의

    작은 코드 조각을 검증하고, 빠르게 수행하고, 격리되고 자동화된 테스트

    이때 격리 문제는 단위 테스트의 고전파와 런던파를 나누는 차이입니다.

     

    격리는 테스트를 위해 하나의 클래스가 다른 클래스와 협력해야 하는 경우 이를 Mock으로 대체할지 실제 객체를 활용할지에 대한 이야기입니다.

     

    런던파에서는 하나의 클래스가 다른 클래스 또는 여러 클래스에 의존하면 이 모든 의존성을 테스트 대역으로 대체해야 합니다.

    즉, 외부 영향과 분리하여 테스트 대상 클래스에만 집중할 수 있어야 합니다.

    이 방법은 장점으로는 테스트가 실패하면 어디에서 실패했는지 확실히 알 수 있습니다.

     

    반대로 고전파는 테스트의 협력자를 대체하지 않고 운영용 인스턴스를 사용합니다.

    예를 들어 Store와 Customer가 존재하면 Store와 Customer를 둘 다 효과적으로 검증합니다.

    하지만 테스트에서 두 클래스는 서로 격리되어 있지 않아 Customer가 올바르게 동작하더라도 Store에 문제가 있으면 테스트에 실패합니다.

     

    단, 테스트가 어떤 순서로든 가장 정합한 방식으로 실행될 수 있어야 하며 서로의 결과에 영향을 미치지 않아야 합니다.

    예를 들어 어떤 테스트가 준비단계에서 데이버베이스에서 고객을 생성하고, 다른 테스트에서는 준비단계에서 고객을 삭제할 수 있습니다. 이 두 가지 테스트를 병렬로 실행하면 첫 번째 테스트가 실패하는데 이는 코드의 문제가 아닌 두 번째 테스트의 간섭 때문입니다.

     

    공유 의존성(shared dependency)

    대표적인 static 키워드가 있으며 해당 필드의 변경 사항은 동일한 프로세스 내에서 실행되는 모든 단위 테스트에서 공유되고 서로의 결과에 영향을 미칠 수 있습니다.

     

    휘발성 의존성

    개발자 머신에 기본 설치된 환경 외에 런타임 환경의 설정 및 구성을 요구합니다.

    비결정적 동작으로 난수 생성기 또는 현재 날짜와 시간을 반환하는 클래스 등이 있습니다.

     

    비공개 의존성(private dependency)

    공유하지 않는 의존성

     

    프로세스 외부 의존성(out-of-process dependency)

    예를 들어 각 테스트 실행 전 도커 컨테이너로 데이터베이스를 시작하지 않으면 서로 같은 데이터베이스 환경을 공유하여 결과에 서로 영향을 줄 수 있습니다.

     

     

     

    공유 의존성와 프로세스 외부 의존성

     

     

    고전파와 런던파

     

    즉, 어떤 대상을 격리하고 교체(mock)로 삼을 것인지가 달라지게 됩니다.

     

    두 분파의 통합테스트

    런던파에서는 실제 협력자 객체를 사용한다면 모두 통합 테스트로 간주합니다.

    고전파에서 작성된 대부분의 테스트는 런던파 지지자에게는 모두 통합 테스트로 느껴집니다.

     

    통합 테스트는 공유 의존성에 접근하는 테스트와 다른 테스트를 분리해서 실행할 수 없거나, 병렬로 실행할 수 없는 경우를 말합니다.

    프로세스 외부 의존성에 접근하게 되면 실행시간이 수백 밀리초 추가되고, 테스트가 많아질수록 1초가 중요해집니다.

     

    간단히 말하면 통합 테스트는 공유 의존성, 프로세스 외부 의존성, 조직 내 다른 팀이 개발한 코드 등과 통합해 작동하는지도 검증하는 테스트입니다.

     

    E2E(End to End) 테스트도 통합 테스트의 일부분입니다.

    다만 E2E 테스트가 더 많은 의존성을 포함하고 최종 사용자의 관점에서 검증하는 것을 의미합니다.

     

    데이터베이스, 파일 시스템, 결제 게이트웨이라는 세 가지 프로세스가 존재한다고 가정하겠습니다.

    일반적인 통합 테스트는 결제 게이트웨이는 테스트 대역으로 대체합니다.

     

    실제 결제 게이트웨이를 사용하려면 결제 처리 부서에 연락하여 특수 테스트 계정을 설정해야 할 수도 있고, 제어하기가 매우 어렵습니다.

    E2E 테스트는 유지 보수 측면에서 가장 많이 들기 때문에 모든 단위 테스트, 통합 테스트를 통과한 후 빌드 프로세스 후반에 실행하는 것이 좋습니다.

     

    또한 local 서버가 아닌 dev, prod 서버에서 실행할 수도 있습니다.

    댓글

Designed by Tistory.