[개념] 코드 커버리지(CODE COVERAGE)와 그 종류

 

코드커버리지가 뭐야?

SW의 각 테스트 케이스에서 얼마나 충족하고 있는지를 나타냅니다.

테스트를 통하여 각 코드/함수가 얼마나 실행되었는지를 확인하게 되고 이를 수치화할 수 있습니다.

 

 

뭘 테스트를 한다는 거야?

만든 프로그램의 실행을 테스트하는 것입니다. 이러한 테스트는 코드커버리지 개념 이전에 '블랙/화이트'박스 테스트로 나눌 수 있습니다.

 

블랙박스 테스트의 특징은 다음과 같습니다.

  • 테스트시, 소프트 웨어의 내부구조 및 작동원리를 모르는 상태에서 동작을 검사, 객체 내에 무엇이 들었는지 알 수 없으며 알지 않아도 된다는 것이 가정됨
  • 옳은 값과 그릇된 값의 입력을 통하여 올바른 출력이 나오는가를 테스트함, 이 때 객체 내부에 어떤 변화가 일어나든 원하는 결과값이 나오면 통과
  • 사용자 관점의 테스트 방법

그에 비해 화이트박스 테스트의 특징은 다음과 같습니다.

  • 테스트시, 소프트웨어의 내부 구조와 동작을 검사, 객체 내부를 확인하고 검증
  • 소프트 웨어 내부 소스 코드를 테스트함. 예를 들어 할당되지 않은 변수가 있는가, 특정 범위만 받는 함수가 있는가가 확인됨.
  • 개발자 관점의 테스트 방법
  • 코드 커버러지는 화이트박스 테스트의 일종

 

 

그럼 코드 커버리지는 특징이 뭔데?

코드 커버리지는 크게 3가지의 기준이 존재합니다. 바로 구문, 조건, 결정 입니다. 각각을 더 기술하면 다음과 같습니다.

  • 구문(statement): 코드 한 줄이 한 번 이상 실행되면 충족
  • 조건(condition): 모든 조건식의 내부 조건식이 참/거짓을 가지면 충족  if( a>0 && b<0 )
  • 결정(dicition): 모든 조건식의 결과가 참/거짓이면 충족 if ( a>0 && b<0

이러한 기준의 충족여부를 판단하도록하는 여러가지 종류의 코드 커버리지가 존재합니다.

 

 

종류가 뭐뭐가 있어?

정확히 몇 개라고 할 수는 없으나, 대표적으로 5가지 정도 소개할 수 있습니다.

 

  •  Function Coverage
  • 각 function이 최소 한 번 실행이 되었는가?
  • function의 호출 여부만 확인, 해당 function의 모든 코드 줄이 실행되었는지는 확인 불가

 

  • Statement Coverage(Line coverage)
  • 각 statement가 실행되었는가?
  • 조건문에 대해 true나 false 하나만 실행되어도 100% 가능
  • 각 라인이 실행가능한 statement라면 해당 라인이 실행되었는지를 확인
  • 특정 조건문에서는 오류를 찾지 못할 수도 있음

 

  • Branch Coverage(Decision coverage, all-edges coverage)
  • 각 조건문이 true/false으로 모두 실행되었는가?
  • 조건문에 대해 true, false가 각각 실행되어야함 
  • Statement coverage가 갖고 있는 단점을 보안하며 비교적 간단하다고 볼 수 있음
  • 조건문의 expression 모두를 확인하지는 않음

 

  • Condition Coverage
  • 각 조건문의 모든 expression들의 true/false 확인 (각 조건의 조합을 따지지않음)
  • branch Coverage의 단점을 보완

 

  • Path Coverage(predicate coverage)
  • 각 function에서 가능한 모든 path를 실행했는가?
  • 심화된 테스팅이 가능 (각 조건문의 조합까지 생각하므로)
  • path가 많아서 문제 (조합이므로 경우의 수가 많아진다)

 

 

추가로, 아래의 코드 커버리지도 대표적인 예입니다.

Modified Condition / Decision Coverage (MC/DC)

Entry / Exit coverage