스물두줄

정보관리기술사 · 개념서 · 소프트웨어 공학

테스트 커버리지와 코드 커버리지

설명 영상 테스트 커버리지와 코드 커버리지 · 2:05

왜 배우는가: 테스트 커버리지와 코드 커버리지는 테스트가 충분했는지 판단하는 기준이라 실무에서 테스트 완료 판정에 쓰인다. 두 개념은 1교시 용어 문제와 3교시 논술 문제로 반복해서 출제되므로 정의와 종류를 함께 정리해 두어야 한다.

출제 이력: 제127회 1교시 7번, 제92회 3교시 2번

1. 한 줄 정의와 핵심 키워드

답안 첫 줄 정의: 테스트 커버리지는 테스트 대상 범위 중 수행된 테스트의 비율이고, 코드 커버리지는 테스트 중 소스코드가 실행된 비율이다.

핵심 키워드

  • 테스트 커버리지(Test Coverage): 요구사항·기능·위험 등 대상 범위 대비 테스트 수행 비율
  • 코드 커버리지(Code Coverage): 소스코드 구조 요소가 실행된 비율
  • 함수 커버리지(Function Coverage): 프로그램의 각 함수가 한 번 이상 호출되었는지 여부
  • 구문 커버리지(Statement Coverage): 실행 가능한 문장이 한 번 이상 실행된 비율
  • 결정 커버리지(Decision Coverage): 분기 조건 전체 결과가 참과 거짓을 모두 가진 정도
  • 조건 커버리지(Condition Coverage): 각 내부 조건이 참과 거짓을 모두 가진 정도
  • MC/DC(Modified Condition/Decision Coverage): 각 조건이 결정 결과에 독립적으로 영향을 주는지 확인하는 기준
  • 경로 커버리지(Path Coverage): 제어 흐름의 실행 경로를 전부 실행한 정도

위 목록은 구문에서 경로 쪽으로 갈수록 요구하는 실행 조합이 많아지는 순서로 배열했다.

2. 개념 풀이

쉬운 말로 하면 테스트를 얼마나 꼼꼼히 했는지 재는 눈금이다. 시험 항목이 얼마나 채워졌는지 보는 것과, 코드가 얼마나 실행됐는지 보는 것 두 가지가 있다.

정식 정의: 테스트 커버리지는 요구사항·기능·위험 등 테스트 대상 범위 중 실제 테스트가 수행된 비율을 나타내는 상위 개념의 테스트 충분성 지표다. 테스트 완전성을 판단하는 기준으로 쓴다.

코드 커버리지는 테스트 실행 중 소스코드의 구조 요소가 얼마나 실행되었는지 측정하는 구조적(화이트박스) 지표다. 코드 구조는 구문, 조건, 결정으로 이루어지며, 이 요소를 얼마나 덮었는지에 따라 측정 기준이 나뉜다.

구문 커버리지는 실행 코드 라인이 한 번 이상 실행되면 충족된다. 조건 커버리지는 각 내부 조건이 참과 거짓을 모두 가질 때 충족되고, 결정 커버리지는 분기 전체 결과가 참과 거짓을 모두 가질 때 충족된다. 결정 커버리지와 분기 커버리지는 정의를 확인해 구분하므로 답안에는 정의를 함께 밝힌다.

포함 관계도 알아야 한다. 분기(Branch) 커버리지는 제어 흐름 그래프의 간선(Edge) 커버리지의 부분집합이다. 같은 67%라도 분기 커버리지가 구문 커버리지보다 더 엄격한 기준이다.

MC/DC는 조건과 결정을 함께 고려한다. 한 조건만 바꿨을 때 결정 결과가 바뀌는 시험 쌍이 각 조건마다 있어야 충족된다. 조건이 많을 때 조합을 전부 시험하지 않고도 조건별 영향을 보인다는 점이 원리의 핵심이다.

3. 등장 배경과 필요성

소프트웨어 규모가 커지면서 테스트를 언제 끝낼지 판단할 객관적 기준이 필요해졌다. 테스트 케이스를 많이 만들어도 실행되지 않은 코드가 남을 수 있어, 실행 여부를 측정하는 지표가 쓰였다.

테스트 케이스 수나 통과율만으로는 완전성을 말하기 어렵다. 요구사항 추적 매트릭스처럼 요구사항에서 설계, 코드, 단위·통합·시스템 테스트까지 연결하는 방식은 테스트 완전성을 범위 관점에서 보여 준다. 반면 코드 커버리지는 구현 관점에서 실제 실행된 부분을 보여 준다. 두 관점을 함께 봐야 완전성을 판단할 수 있다.

코드 커버리지 도구는 어떤 방법으로 만든 테스트 모음이든 완전성을 평가할 수 있다. 블랙박스 방식으로 만든 시험도 실행 범위를 측정할 수 있어, 거의 실행되지 않은 부분을 찾는 데 쓰인다. 사람이 로그를 찍거나 디버거로 확인하는 방식은 매우 힘들어 측정 도구의 역할이 커졌다.

항공·자동차처럼 안전이 중요한 소프트웨어에서는 MC/DC 같은 강한 기준이 요구되는 경우가 많다. 구문 커버리지 100%가 결함 없음을 뜻하지는 않는다. 같은 코드가 다른 입력을 바르게 처리하는지는 구문 커버리지로 보장되지 않기 때문이다.

4. 구성요소·원리·절차

코드 커버리지는 테스트 실행 중 소스코드의 어느 부분이 실행되었는지를 측정하는 지표다. 측정 대상은 구문(Statement), 분기(Branch), 조건(Condition), 결정(Decision), 변경조건/결정(MC/DC), 경로(Path) 로 나뉜다. 측정 단위가 세분화될수록 요구되는 테스트 케이스 수가 늘고 결함 검출 강도가 높아진다.

구성요소측정 대상충족 조건강도
함수 커버리지함수·서브루틴모든 함수가 한 번 이상 호출낮음
구문 커버리지실행 문장·코드 라인모든 문장이 한 번 이상 실행낮음
분기 커버리지제어문의 참·거짓 분기각 분기(true/false)가 모두 실행중간
조건 커버리지불리언 부분식각 조건이 참·거짓을 모두 취함중간
조건/결정 커버리지조건과 결정조건 커버리지와 결정 커버리지를 동시에 만족중상
MC/DC결정 내 각 조건각 조건이 결정 결과에 독립적으로 영향을 줌높음

함수 커버리지는 함수 호출 여부만 본다. 구문 커버리지는 문장 실행 여부만 본다. 분기 커버리지는 if·case의 양쪽 경로를 본다. 조건 커버리지는 복합 조건의 각 항을 본다. 결정 커버리지와 분기 커버리지는 정의와 측정 기준을 확인해 구분한다.

원리는 제어 흐름 그래프(CFG)에서 출발한다. 노드는 문장 묶음, 간선은 제어 이동이다. 구문 커버리지는 노드를, 분기 커버리지는 간선을 대상으로 한다. 따라서 구문 커버리지가 100%여도 간선 중 일부가 빠질 수 있다.

커버리지 수치가 높아도 결함 없음을 보장하지 않는다

측정 절차는 다음과 같다.

  • 측정 기준(구문·분기·MC/DC 등)을 프로젝트 안전 등급에 맞게 정한다.
  • 계측기(instrumentation)를 소스 또는 바이너리에 삽입하거나 컴파일러 옵션으로 활성화한다.
  • 테스트 스위트를 실행하면서 실행된 문장·분기 기록을 수집한다.
  • 기록을 분모(전체 대상 수)로 나누어 비율을 계산한다.
  • 미충족 항목을 식별하고 추가 테스트 케이스를 설계한다.
  • 목표 비율에 도달할 때까지 3~5단계를 반복한다.

구문 커버리지 비율은 다음과 같이 계산한다.

$\text{구문 커버리지}(\%) = \frac{\text{실행된 구문 수}}{\text{전체 구문 수}} \times 100$

여기서 실행된 구문 수는 테스트 중 한 번 이상 실행된 문장 수, 전체 구문 수는 계측 대상 문장 수다. 분기 커버리지도 같은 형식으로 간선 수를 분모로 한다.

5. 관련 법령·기준·표준

코드 커버리지 자체에 대한 법령 기준은 없다. 다만 항공·철도·의료·원자력 등 안전 필수 분야의 소프트웨어 기준은 커버리지 등급을 요구한다. 대표 기준은 다음과 같다.

기준적용 분야요구 커버리지비고
DO-178C항공 탑재 소프트웨어안전 등급별 커버리지 기준항공 안전 등급(DAL)에 따라 요구 수준이 달라짐
IEC 61508전기·전자·프로그래머블 전자 안전커버리지 기준기능안전 일반 기준
ISO 26262자동차 기능안전커버리지 기준자동차 전장 소프트웨어
항목기준 수치적용 조건근거
안전 필수 소프트웨어 커버리지커버리지 기준안전 등급별DO-178C 계열
일반 구문 커버리지100% 목표 권장일반 상용 소프트웨어실무 관행
분기 커버리지구문 커버리지보다 강한 기준제어문 포함 코드위키백과 설명

위 표는 기준별 커버리지 관련 내용을 요약한 것이다. 국내 소프트웨어 안전 관련 고시가 커버리지를 직접 정하는 경우는 확인되지 않았다.

6. 유형과 비교

코드 커버리지는 측정 대상이 되는 구조 요소에 따라 여러 기준으로 나뉜다. 기준은 대략 함수, 구문, 분기·결정, 조건, 조건/결정, 다중조건, 경로 순으로 강도가 높아진다. 아래 표는 구문 커버리지와 분기 커버리지를 비교한다.

비교 항목구문(Statement) 커버리지분기(Branch) 커버리지
측정 단위실행 가능한 구문(문장)조건문의 참·거짓 분기
충족 조건모든 구문이 한 번 이상 실행모든 분기 방향이 한 번 이상 실행
검출 강도상대적으로 낮음구문보다 높음
측정 예if문의 then 쪽만 실행해도 100% 가능then·else 양쪽을 모두 실행해야 100%

이어지는 내용

로그인하면 하루 2페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 단원 읽기