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로 나오게 되어 결정 커버리지를 만족하지 못하는 코드인 것이다.
결론
모든 시나리오를 상정하고 테스트 코드를 작성하기는 까다롭다..! 커버리지 개념을 통해 정적 코드 분석 단계에서 조금 더 많은 시나리오에 대한 테스트 코드를 작성할 수 있을 것 같다.