본문 바로가기
Test

코드 커버리지 적용(1) - 커버리지란?

by byeongoo 2021. 11. 30.

1. 코드 커버리지란?

코드 커버리지는 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표중 하나이다. 테스트를 진행하였을 때 '코드 자체가 얼마나 실행되었느냐'를 수치로 확인할 수 있다.

 

코드 커버리지는 소스 코드를 기반으로 수행하는 화이트 박스 테스트를 통해 측정한다.

 

2. 코드 커버리지 측정 기준

코드의 구조는 구문(Statement), 조건(Condition), 결정(Decision)의 구조로 이루어져있고, 이러한 코드의 구조를 얼마나 커버했느냐에 따라 측정 기준이 나뉘게된다.

 

2.1 구문(Statement)

라인 커버리지라고도 부르며 코드 한줄이 한번 이상 실행된다면 충족된다. x가 -1일 때 테스트 데이터로 사용할 경우 if문의 조건을 통과하지 못하기 때문에 3번 코드는 실행이 되지 않는다. 따라서 구문 커버리지는 3/4 * 100 = 75(%)이다.

 

void foo (int x) {
    system.out("start line"); // 1번
    if (x > 0) { // 2번
        system.out("middle line"); // 3번
    }
    system.out("last line"); // 4번
}

 

2.2 조건(Condition)

여기서의 조건은 모든 조건식을 얘기한다. 내부 조건이 true/false의 경우를 충족하는 지를 본다.

void test(int a, int b) {
  // 함수 A 실행 - 1번
  if (a > 0 && b < 0) { //- 2번
    // 함수 B 실행 - 3번
  }
  // 함수 C 실행 - 4번
}

여기서 내부 조건식은 a > 0  b < 0를 얘기하며 각각이 true/false의 경우가 있으면 조건 커버리지를 만족한다.

a=1, b=1인 테스트 케이스와 a = -1, b = -1 테스트 케이스를 만들면 조건식 a>0, b<0 은 각각 양수일 때 와 음수일 때 모두 테스트 케이스가 존재하므로 조건 커버리지를 만족한다.

 

하지만 a > 0 && b < 0 은 모두 false이므로 조건 커버리지를 만족하더라도 구문 커버리지와 결정 커버리지를 만족하지 못하는 경우가 존재한다.

 

2.3 결정(Decision)

브랜치(Branch) 커버리지라고 부르기도 한다. 모든 조건식이 true/false를 가지게 되면 충족된다.

void test(int a, int b) {
  // 함수 A 실행 - 1번
  if (a > 0 && b < 0) { //- 2번
    // 함수 B 실행 - 3번
  }
  // 함수 C 실행 - 4번
}

 

위의 함수에서 결정은 내부 조건이 아닌 조건식을 얘기한다. 즉, 위에 코드에서는 a > 0 && b < 0를 얘기한다. 

따라서 a=1, b=-1와 a = -1, b = 3 이렇게 테스트 케이스를 구성하면 결정 커버리지를 만족한다.

 

3. 가장 많이 사용하는 코드 커버리지

가장 많이 사용하는 커버리지는 구문 커버리지이다. 그 이유는 조건 커버리지나 브랜치 커버리지의 경우 코드 실행에 대한 테스트보다는 로직의 시나리오에 대한 테스트에 더 가깝다고 볼 수 있기 때문이다.

 

위에 두 커버리지는 조건문이 존재하지 않는 코드의 경우 그 코드는 커버리지 대상에서 아예 제외를 한다. 즉, 해당 코드들을 테스트를 하지 않는다.

 

그러나 구문 커버리지를 만족한다면, 모든 코드를 테스트 코드가 커버했다고는 말할 수 있다. 물론 위에 결정 커버리지의 코드 예시에서 조건식이 false인 시나리오에 대해서 테스트 됐다고 보장할 수 없지만 그래도 조건문 내부의 코드가 실행

되었을 때 문제가 없다는 것은 보장할 수 있다.

 

 

REFERENCE

https://err0rcode7.github.io/backend/2021/05/11/%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%BB%A4%EB%B2%84%EB%A6%AC%EC%A7%80.html

 

테스트 커버리지(Test Coverage)

테스트 커버리지(Test Coverage)

err0rcode7.github.io

https://seller-lee.github.io/java-code-coverage-tool-part1

 

코드 분석 도구 적용기 - 1편, 코드 커버리지(Code Coverage)가 뭔가요?

안녕하세요. 우아한테크코스…

seller-lee.github.io