[단위 테스트] 원칙과 패턴 (1장 , 2장) - 목표 및 정의

2025. 4. 14. 14:55·기타

 

1장 : 단위 테스트의 목적

단위 테스트는 소프트웨어 품질을 확보하기 위한 가장 비용 효율적인 도구 중 하나입니다. 단순히 테스트 코드를 작성하는 것을 넘어, 다음과 같은 목적을 가지고 있습니다:

  • 분석 도구로서 테스트 활용
  • 공통적인 안티패턴 방지 및 좋은 습관 정립
  • "좋은 테스트란 무엇인가"에 대한 기준 정립

테스트 관련 비용 요소

테스트는 잘 관리하면 강력한 보험이 되지만, 유지보수 비용이 높아질 위험도 있습니다. 다음과 같은 점에 유의해야 합니다:

  • 기반 코드 리팩터링 시, 테스트도 함께 수정이 필요합니다.
  • 모든 코드 변경 시 테스트 실행은 필수입니다.
  • 테스트가 잘못된 경고를 발생시키면, 반드시 수정하거나 제거해야 합니다.
  • 테스트는 기반 코드를 이해하는 수단이 되기도 하지만, 그만큼 해석 시간도 들어갑니다.

테스트 커버리지의 의미와 한계

  • 테스트 커버리지는 테스트가 제품 코드 중 몇 퍼센트를 실행했는지를 나타내는 지표입니다.
    • 코드 커버리지: 라인 단위 기준
    • 분기 커버리지: 조건문 분기 기준
  • 높은 커버리지가 항상 좋은 테스트를 의미하지는 않습니다.
  • 낮은 커버리지는 문제의 신호일 수 있지만, 높은 커버리지는 충분조건이 아닙니다.
  • 분기 커버리지는 테스트의 안전성을 가늠하는 데 도움을 줄 수 있지만, 이를 넘어서 테스트의 질적 평가가 필요합니다.

성공적인 테스트 스위트란?

다음 세 가지 조건을 충족할 수 있어야 합니다:

  1. 개발 주기에 자연스럽게 통합되어야 합니다.
  2. 가장 핵심적인 로직만 테스트할 수 있어야 합니다.
  3. 최소한의 비용으로 최대의 가치를 제공해야 합니다.

핵심 정리

  • 시간이 지날수록 소프트웨어는복잡도(엔트로피)가 증가합니다.
  • 테스트는 이 엔트로피를 되돌리는 수단이며, 회귀 방지용 보험 역할을 합니다.
  • 테스트가 없는 프로젝트는 쉽게 침체되며, 릴리스마다 회귀 위험이 커집니다.
  • 좋은 테스트는 리트머스 시험지 역할을 하며, "지속 가능한 성장"을 위한 기초가 됩니다.

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

  • 단위 테스트는 작은 코드 조각(유닛)이 제대로 동작하는지를 검증합니다.
  • 빠르고 독립적으로 실행되어야 하며,
  • 다른 테스트에 영향을 주지 않도록 격리되어야 합니다.

단위 테스트의 격리 관점: 고전파 vs 런던파

고전파(Classical School)

  • 테스트 대상 유닛을 "기능 단위"로 간주합니다.
  • 협력 객체 중 공유 자원(DB, 네트워크 등)만 테스트 대역으로 대체합니다.
  • 실제 객체를 활용하는 것을 선호하며,
  • 테스트는 "코드가 아닌 기능을 검증"해야 한다는 철학을 가집니다.

런던파(London School)

  • 테스트 대상 유닛을 "클래스 단위"로 간주합니다.
  • 테스트 대상 클래스가 의존하는 모든 객체를 테스트 대역(Mock, Stub 등)으로 대체합니다.
  • 테스트 입자성(granularity)이 높고,
  • 실패 시 문제의 원인을 빠르게 좁힐 수 있는 장점이 있습니다.

런던파의 한계

  • 과잉 명세(Overspecification) 위험이 존재합니다.
  • 테스트가 구현 세부사항과 밀접하게 결합되면, 리팩터링 시 테스트도 잦은 변경을 겪게 됩니다.
  • 이 경우 테스트가 설계를 제약하게 되어 오히려 개발 속도를 저하시킬 수 있습니다.
  • 지나치게 세분화된 단위 테스트는, 설계가 잘못된 신호일 수도 있습니다.

단위 테스트 vs 통합 테스트 vs E2E

구분설명
단위 테스트 빠르고, 작고, 격리된 테스트. 코드 조각 단위
통합 테스트 외부 시스템(DB, 파일 등)에 의존. 느리고 넓음
E2E 테스트 사용자 관점의 전체 시스템 테스트. 전체 흐름 검증

단위 테스트는 빠르고 정확해야 하며,
통합 테스트와 E2E 테스트는 단위 테스트를 보완하는 역할을 합니다.


요약 정리

  • 단위 테스트는 작고 빠르며 독립적이어야 합니다.
  • 고전파는 실제 객체 사용을 선호하며 기능 중심 테스트를 지향합니다.
  • 런던파는 모든 의존성을 대체하여 테스트 입자성을 높이는 방식입니다.
  • 둘 사이의 균형을 맞추는 것이 중요합니다. 목적과 상황에 따라 전략을 선택해야 합니다.

'기타' 카테고리의 다른 글

[단위 테스트] 원칙과 패턴 (7장) - 단위테스트를 위한 리팩터링  (0) 2025.04.18
[단위 테스트] 원칙과 패턴 (6장) - 단위 테스트 스타일  (0) 2025.04.17
[단위 테스트] 원칙과 패턴 (5장) - 목과 테스트 취약성  (0) 2025.04.16
[단위 테스트] 원칙과 패턴 (4장) - 좋은 단위 테스트의 4대 요소  (0) 2025.04.15
[단위 테스트] 원칙과 패턴 (3장) - 단위 테스트 작성 원칙  (0) 2025.04.15
'기타' 카테고리의 다른 글
  • [단위 테스트] 원칙과 패턴 (6장) - 단위 테스트 스타일
  • [단위 테스트] 원칙과 패턴 (5장) - 목과 테스트 취약성
  • [단위 테스트] 원칙과 패턴 (4장) - 좋은 단위 테스트의 4대 요소
  • [단위 테스트] 원칙과 패턴 (3장) - 단위 테스트 작성 원칙
ksngh
ksngh
웹 백엔드 개발 블로그입니다. https://github.com/ksngh
  • ksngh
    featherdale
    ksngh
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 데이터베이스 (10)
      • spring (11)
      • redis (7)
      • ELK (11)
      • 회고 (6)
      • 기타 (13)
        • java (2)
        • 디자인패턴 (2)
        • 영어 (1)
        • 자바스크립트 (1)
        • graphQL (2)
        • 블록체인 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    Elasticsearch
    graphql
    Spy
    단위테스트
    단위 테스트
    PostgreSQL
    gof
    elastic search in action
    레디스
    spring
    NORI
    조인의 종류
    회고
    Mock
    Text to SQL
    대용량 데이터 베이스
    대용량데이터베이스
    연말 회고
    데이터베이스
    nori tokenizer
    Elastic Search
    Spring Core
    NoriTokenizer
    엘라스틱서치
    core
    자료구조
    엘라스틱 서치
    엘라스틱 서치 인 액션
    Redis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
ksngh
[단위 테스트] 원칙과 패턴 (1장 , 2장) - 목표 및 정의
상단으로

티스토리툴바