테스트 커버리지
· 약 8분
💡 다음 내용은 chatGPT를 기반으로 작성된 내용으로, 부정확한 정보가 있을 수 있습니다.
테스트 커버리지란?
- 테스트 커버리지(Test Coverage)는 소프트웨어 테스트의 범위를 측정하는 지표
- 테스트가 얼마나 철저히 이루어졌는지를 나타내는 수치
코드 커버리지
- 프로그램 코드 중 테스트된 코드가 차지하는 비율
- 전체 코드가 100줄인데 테스트를 통해 80줄이 실행되었다면, 테스트 커버리지는 80%
기능 커버리지
- 소프트웨어의 기능이 얼마나 테스트되었는지 확인하는 개념
- 모든 기능이 테스트되었는지, 주요 기능만 다루고 있는지를 평가
테스트 커버리지의 유형
- 문장(Statement) 커버리지: 코드의 각 문장이 실행되었는지 확인
- 분기(Branch) 커버리지: 조건문(if, switch 등)의 각 분기가 실행되었는지 확인
- 조건(Condition) 커버리지: 조건문에서 개별 조건이 참/거짓을 모두 만족했는지 확인
왜 중요할까?
- 결함 감소: 더 높은 커버리지는 소프트웨어 결함을 줄이는 데 도움을 줌
- 품질 관리: 테스트가 충분히 이루어졌는지 객관적으로 확인
- 리스크 최소화: 테스트되지 않은 부분에서 발생할 수 있는 예기치 못한 오류를 감소
테스트 커버리지 유형
1. 문장(Statement) 커버리지
기본 개념: 코드의 각 문장이 한 번이라도 실행되었는지를 확인
- 목표: 코드의 모든 문장이 실행되도록 테스트 케이스를 작성
- 장점: 구현된 코드의 기본적인 실행 여부를 빠르게 확인 가능
- 한계: 조건문 내부의 다양한 경로(분기)나 복잡한 논리는 놓칠 수 있음
if (x > 0):
y = x
x > 0
조건이 참인 경우만 실행하면 문장 커버리지는 충족되지만, x <= 0
의 경우는 테스트되지 않을 수 있음
2. 분기(Branch) 커버리지
기본 개념: 조건문(if, switch 등)의 모든 분기 경로가 실행되었는지 확인
- 목표: 코드의 분기마다 테스트 케이스를 작성해 모든 분기가 실행되도록 함
- 장점: 다양한 경로에 대한 테스트 가능
- 한계: 모든 가능한 조건 조합을 보장하지는 못함
if (x > 0):
y = x
else:
y =- x
분기 커버리지는 x > 0
(참)과 x <= 0
(거짓) 모두를 테스트해야 충족
3. 조건(Condition) 커버리지
기본 개념: 조건문 내부의 개별 조건식이 참과 거짓을 모두 만족하는지를 확인
- 목표: 조건식 자체의 모든 가능성을 테스트
- 장점: 조건문의 논리적 정확성을 검증
- 한계: 전체 분기 경로를 확인하지는 못할 수도 있음
if (a > 0 && b < 5):
y = a + b
a > 0
과 b < 5
의 각각이 참/거짓을 모두 만족해야 조건 커버리지가 충족
4. 결합 조건/분기 커버리지 (Condition/Decision Coverage, CDC)
기본 개념: 분기 커버리지와 조건 커버리지를 결합한 형태
- 목표: 각 조건이 참/거짓을 만족하고, 분기 경로가 모두 실행되도록 함.
- 장점: 더 정교한 테스트 가능.
- 한계: 테스트 케이스 수가 많아질 수 있음.
5. 변형 조건/결정 커버리지 (Modified Condition/Decision Coverage, MC/DC)
기본 개념: 조건/결정 커버리지를 개선한 형태로, 각 조건이 분기 결과에 독립적으로 영향을 미침을 보장
- 목표: 조건식 간의 상호 의존성을 고려하여 더 효과적인 테스트 작성
- 장점: 테스트 케이스 수를 줄이면서 논리적 오류 발견
- 적용 사례: 안전-critical한 소프트웨어(항공, 의료 등)에서 사용
if (A || B):
y = 10
A와 B가 각각 결과에 영향을 주는 테스트를 모두 작성해야 MC/DC가 충족
6. 루프(Loop) 커버리지
기본 개념: 반복문(loop)이 다양한 조건에서 제대로 동작하는지를 확인
- 목표: 반복문이 (1) 실행되지 않는 경우, (2) 한 번만 실행되는 경우, (3) 여러 번 실행되는 경우를 모두 테스트
- 장점: 반복문에서 발생할 수 있는 오류 방지
- 한계: 복잡한 반복문에서는 테스트 케이스가 많아질 수 있음
7. 패스(Path) 커버리지
기본 개념: 프로그램의 모든 가능한 실행 경로를 테스트합니다.
- 목표: 프로그램의 시작부터 끝까지의 모든 경로를 따라가며 테스트
- 장점: 모든 실행 경로를 테스트하므로 가장 철저한 커버리지
- 한계: 경로가 많을 경우 현실적으로 모든 경로를 테스트하기 어려움
비교 요약
유형 | 측정 대상 | 테스트 목표 | 예시 |
---|---|---|---|
문장 커버리지 | 코드의 각 문장 | 모든 문장이 실행되었는지 | 단순 실행 |
분기 커버리지 | 조건문의 분기 | 모든 분기 실행 | if 참/거짓 |
조건 커버리지 | 조건식의 개별 조건 | 조건식의 참/거짓 모두 테스트 | 조건별 확인 |
결합 조건/분기 커버리지 | 조건 + 분기 | 분기와 조건의 모든 경우 확인 | 분기+조건 |
변형 조건/결정 커버리지 | 조건 간 독립성 검증 | 조건이 결과에 미치는 영향 검증 | 상호 독립 |
루프 커버리지 | 반복문 | 다양한 반복 상태 테스트 | 반복 테스트 |
패스 커버리지 | 실행 경로 | 모든 가능한 경로 테스트 | 경로 탐색 |