Contents

Code Coverage

sonarqube code coverage 관련 내용은 어떤 것인지 궁금해하다가 code coverage 개념에 대해 찾아보게 되었다.

https://tecoble.techcourse.co.kr/post/2020-10-24-code-coverage/

정의

코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표이다. 테스트를 진행하였을 때, 코드 자체가 얼마나 실행되었느냐?를 수치로 나타낸다.

종류

코드 커버리지는 코드 자체가 테스트 실행 시 얼마나 실행되었는지를 측정하는데, 이에 대한 기준이 조금씩 다를 수 있다.

때문에 코드 커버리지의 종류는 실행되는 코드 기준에 따라 다르게 구분된다.

위 링크에서 예시로 들었던 코드는 아래와 같다.

void foo(int x) {
    sout("start line"); // 1
    if (x > 0 && y < 0) { // 2
        sout("middle line"); // 3
    }
    sout("last line"); // 4
}

구문 커버리지 (statement coverage)

코드의 라인이 한 번 이상 실행되면 충족되는 가장 단순한 커버리지이다.

위 코드에서는 x = -1, y = 1일 때만 테스트 데이터로 사용했을 때에는 middle line 3번 코드는 실행되지 않는다.

총 4개의 코드 라인 중 3개만 실행되었으니 75%의 커버리지를 가지는 코드이다.

조건 커버리지 (condition coverage)

모든 조건식의 내부 조건이 true/false를 가지게 되면 충족되는 커버리지이다.

위 조건에서 테스트 데이터로 x = 1, y = 1, x = -1, y = -1이 있다고 가정해보자.

주의해야 할 점은 조건 커버리지는 if문의 관점에서 true / false를 만족하는 케이스가 없어도 된다는 것이다. 즉 x = 1, y = 1, x = -1, y = -1를 테스트 케이스로 사용할 경우 if문 관점에서는 두 가지 케이스 모두 false가 되어 모든 경우를 테스트 하는 것이 아닌가? 할 수 있지만 (물론 아래에서 설명할 내용과 연관되어 있다) 조건 커버리지는 내부 조건에 대한 모든 케이스가 존재하기 때문에 만족된다.

정리하자면 x > 0에 대한 true / false, y < 0에 대한 true / false가 모두 있어야 조건 커버리지를 만족시킬 수 있다.

결정 커버리지 (decision coverage)

조건 커버리지에서 언급했던 내용이다. 테스트 데이터로 x = 1, y = 1, x = -1, y = -1을 사용했을 때에,

x > 0에 대한 true / false가 모두 존재하고, y < 0에 대한 true / false가 모두 있는 것은 상관 없고, if문의 최종 결과가 결국 true / false가 모두 존재하는가에 대한 커버리지이다.

즉 이전 테스트 케이스였던 x = 1, y = 1, x = -1, y = -1 테스트의 경우 if문 결과가 둘 다 false로 나오게 되어 결정 커버리지를 만족하지 못하는 코드인 것이다.

결론

모든 시나리오를 상정하고 테스트 코드를 작성하기는 까다롭다..! 커버리지 개념을 통해 정적 코드 분석 단계에서 조금 더 많은 시나리오에 대한 테스트 코드를 작성할 수 있을 것 같다.