1장 : 단위 테스트의 목적
단위 테스트는 소프트웨어 품질을 확보하기 위한 가장 비용 효율적인 도구 중 하나입니다. 단순히 테스트 코드를 작성하는 것을 넘어, 다음과 같은 목적을 가지고 있습니다:
- 분석 도구로서 테스트 활용
- 공통적인 안티패턴 방지 및 좋은 습관 정립
- "좋은 테스트란 무엇인가"에 대한 기준 정립
테스트 관련 비용 요소
테스트는 잘 관리하면 강력한 보험이 되지만, 유지보수 비용이 높아질 위험도 있습니다. 다음과 같은 점에 유의해야 합니다:
- 기반 코드 리팩터링 시, 테스트도 함께 수정이 필요합니다.
- 모든 코드 변경 시 테스트 실행은 필수입니다.
- 테스트가 잘못된 경고를 발생시키면, 반드시 수정하거나 제거해야 합니다.
- 테스트는 기반 코드를 이해하는 수단이 되기도 하지만, 그만큼 해석 시간도 들어갑니다.
테스트 커버리지의 의미와 한계
- 테스트 커버리지는 테스트가 제품 코드 중 몇 퍼센트를 실행했는지를 나타내는 지표입니다.
- 코드 커버리지: 라인 단위 기준
- 분기 커버리지: 조건문 분기 기준
- 높은 커버리지가 항상 좋은 테스트를 의미하지는 않습니다.
- 낮은 커버리지는 문제의 신호일 수 있지만, 높은 커버리지는 충분조건이 아닙니다.
- 분기 커버리지는 테스트의 안전성을 가늠하는 데 도움을 줄 수 있지만, 이를 넘어서 테스트의 질적 평가가 필요합니다.
성공적인 테스트 스위트란?
다음 세 가지 조건을 충족할 수 있어야 합니다:
- 개발 주기에 자연스럽게 통합되어야 합니다.
- 가장 핵심적인 로직만 테스트할 수 있어야 합니다.
- 최소한의 비용으로 최대의 가치를 제공해야 합니다.
핵심 정리
- 시간이 지날수록 소프트웨어는복잡도(엔트로피)가 증가합니다.
- 테스트는 이 엔트로피를 되돌리는 수단이며, 회귀 방지용 보험 역할을 합니다.
- 테스트가 없는 프로젝트는 쉽게 침체되며, 릴리스마다 회귀 위험이 커집니다.
- 좋은 테스트는 리트머스 시험지 역할을 하며, "지속 가능한 성장"을 위한 기초가 됩니다.
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 |
