개요
코드 커버리지(Code Coverage)는 소프트웨어 테스트 과정에서 테스트 대상 소스 코드가 얼마나 실행되었는지를 백분율로 나타내는 정량적 지표이다. 테스트의 충분성과 효과를 측정하기 위해 사용되며, 화이트박스 테스트(White Box Test)의 일부로 분류된다. 테스트 스위트가 코드의 어느 부분을 실행했는지, 어느 부분을 실행하지 않았는지를 수치화하여 개발자에게 제공함으로써 테스트의 사각지대를 식별하는 데 도움을 준다.
측정 기준
코드 커버리지는 코드의 구조적 요소를 기준으로 여러 가지 방식으로 측정된다. 주요 측정 기준은 다음과 같다.
구문 커버리지 (Statement Coverage)
라인 커버리지(Line Coverage)라고도 불린다. 전체 실행 가능한 구문(statement) 중 테스트를 통해 한 번 이상 실행된 구문의 비율을 측정한다. 가장 널리 사용되는 기본적인 커버리지 기준이다.
결정 커버리지 (Decision Coverage)
분기 커버리지(Branch Coverage)라고도 불린다. 조건문(if, while 등)의 전체 조건식이 참(True)이 되는 경우와 거짓(False)이 되는 경우가 각각 최소 한 번 이상 실행되었는지를 측정한다. 개별 조건식의 개수와는 관계없이 전체 분기 결과를 기준으로 판단한다.
조건 커버리지 (Condition Coverage)
개별 조건식 각각이 참(True)과 거짓(False)의 값을 각각 최소 한 번 이상 가지는지를 측정한다. 예를 들어 if (a > 0 && b < 5)라는 조건문이 있을 때, a > 0과 b < 5라는 각각의 조건식이 모두 참과 거짓을 한 번씩 가지면 충족된다.
조건/결정 커버리지 (Condition/Decision Coverage, C/DC)
조건 커버리지와 결정 커버리지를 동시에 만족하는 기준이다. 개별 조건식과 전체 결정문 모두 최소 한 번씩 참과 거짓을 가지면 충족된다.
변경 조건/결정 커버리지 (MC/DC)
각 개별 조건식이 다른 조건식의 영향을 받지 않고 전체 결정 결과에 독립적으로 영향을 미치는 경우를 테스트하는 기준이다. 항공 및 자동차 등 안전이 중요한 시스템(ISO 26262 등)에서 요구되는 커버리지 기준으로 알려져 있다.
다중 조건 커버리지 (Multiple Condition Coverage, MCC)
모든 개별 조건식의 모든 논리적 조합을 고려한 커버리지이다. 가장 엄격한 기준이지만 테스트 케이스의 수가 기하급수적으로 증가할 수 있다.
경로 커버리지 (Path Coverage)
프로그램의 처음부터 끝까지 가능한 모든 실행 경로가 최소 한 번 이상 수행되었는지를 측정한다.
측정 도구
코드 커버리지 측정은 일반적으로 자동화 도구를 통해 수행된다. 대표적인 도구는 다음과 같다.
| 도구 | 주요 지원 언어 | 특징 |
|---|---|---|
| JaCoCo | Java | Maven/Gradle 연동, 브랜치 및 라인 커버리지 지원 |
| Istanbul / nyc | JavaScript | 브라우저 및 Node.js 지원, HTML 리포트 제공 |
| Coverage.py | Python | 조건, 라인, 함수 커버리지 측정 가능 |
| Cobertura | Java | XML 및 HTML 형식의 리포트 생성 |
| dotCover | C#, .NET | Visual Studio 연동 |
| Go Cover | Go | Go 언어 내장 커버리지 측정 기능 |
| Clover | Java | Atlassian 제품군과 연동 |
활용과 한계
코드 커버리지는 CI/CD(지속적 통합/지속적 배포) 파이프라인의 품질 게이트(Quality Gate)로 자주 활용된다. 일반적으로 80% 전후의 커버리지가 적절한 목표로 언급되나, 이는 프로젝트의 성격과 요구되는 안전 수준에 따라 달라진다.
코드 커버리지가 가지는 주요 한계는 다음과 같다.
- 100% 커버리지가 완벽한 테스트를 보장하지 않는다. 코드가 실행되었다는 사실만으로 해당 코드가 올바르게 동작한다는 것을 증명하지는 않는다. 테스트 자체가 잘못 작성되었거나, 검증(assertion)이 부실하면 높은 커버리지에도 불구하고 버그가 존재할 수 있다.
- 테스트의 질(Quality)을 측정하지 않는다. 커버리지는 양적 지표일 뿐, 테스트가 예외 상황이나 경계값을 적절히 검증하는지에 대한 정보는 제공하지 않는다.
- 커버리지 자체를 목적으로 한 테스트 작성의 위험. 커버리지 수치를 높이기 위해 의미 없는 테스트 케이스를 추가하거나, 실제 비즈니스 로직 검증보다 커버리지 달성에 집중하게 될 수 있다.
따라서 코드 커버리지는 테스트 품질 평가의 보조 지표로 사용되어야 하며, 테스트의 내용과 검증의 적절성을 함께 고려하는 것이 중요하다.
같이 보기
- 화이트박스 검사
- 회귀 테스트
- 정적 프로그램 분석
- 단위 테스트
- 테스트 주도 개발(TDD)