테스트 커버리지? 코드 커버리지란?
Test Coverage / Code Coverage란?
많은 서비스 기업에서는 테스트 코드의 중요성을 인지하고 코드 커버리지를 최대한 유지 및 지속, 상승시키면서 개발을 하려고 노력합니다.
테스트 커버리지/코드 커버리지란 시스템 또는 소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타낸 것입니다.
테스트를 진행하였을 때 '코드 자체가 얼마나 실행되었느냐'는 것으로 수치를 통해 확인할 수 있습니다.
코드 커버리지는 어떤 기준으로 측정할까?
소스 코드 기반으로 수행되는 화이트 박스 테스트를 통해 측정됩니다.
화이트 박스 테스트란?
- 응용 프로그램의 내부 구조와 동작을 검사하는 테스트 방식
- 개발자 간점의 단위 테스트 방법
블랙박스 테스트란?
- 소프트웨어의 내부 구조나 동작 원리를 모르는 상태에서 하는 테스트 방식
- 사용자 관점의 테스트 방법
그러면 측정하는 기준으로는 어떤 것들이 있을까요?
코드의 구조는 크게 3가지로 이루어져 있습니다.
1. 구문
2. 조건
3. 결정
구문
라인(Line) 커버리지라고도 불립니다.
코드 한 줄이 한 번 이상 실행된다면 충족됩니다.
void myMethod(int x){
print("start line"); //1번
if( x > 0){ //2번
print("middle line"); //3번
}
print("last line") //4번
}
위와 같이 코드를 라인 별로 1번, 2번, 3번, 4번이라고 생각해봅시다.
만약 x = -1값을 넣고 테스트하게 되었을 때 1번, 2번, 4번 라인의 코드만 실행됩니다.
즉, 3번라인의 코드는 실행되지 못했습니다.
총 4개의 라인 중 3개의 라인만 실행되었기 때문에 구문/라인 커버리지는 3/4 * 100 = 75%입니다.
구문/라인 커버리지 = (실행된 라인 / 모든 라인) * 100
조건
모든 조건식의 내부 조건이 true/false를 가지게 되면 충족됩니다.
내부 조건이란 조건식 내부의 각각의 조건을 의미합니다.
void myMethod(int x, int y){
print("start line"); //1번
if( x > 0 && y < 0){ //2번
print("middle line"); //3번
}
print("last line") //4번
}
위의 코드의 내부 조건은 x > 0, y < 0을 의미합니다.
조건 커버리지를 만족하는 테스트 케이스로는 x=1, y=1 // x=-1, y=-1가 있습니다.
x>0 내부 조건에 대해 true/false를 만족하고, y <0 내부 조건에 대해 false/true를 만족합니다.
하지만 해당 if문은 무조건 false만 반환하게 됩니다.
따라서 조건 커버리지는 만족했지만 3번 라인이 실행되지 않았으므로 라인 커버리지는 만족되지 않았습니다.
조건 커버리지를 만족하도록 테스트를 작성해도, 구문 커버리지와 결정 커버리지를 만족하지 못하는 경우가 존재할 수 있습니다.
결정
브랜치(Branch) 커버리지라고 부르기도 합니다.
모든 조건식이 true/false를 가지게 되면 충족됩니다.
void myMethod(int x, int y){
print("start line"); //1번
if( x > 0 && y > 0){ //2번
print("middle line"); //3번
}
print("last line") //4번
}
2번라인의 조건식에 대하여 true/false를 가지기 위한 테스트 케이스로는 x=1, y=1, // x= -1, y=-1가 존재합니다.
세 가지 코드 커버리지 중에서는 구문/라인 커버리지가 가장 많이 사용되고 있습니다.
라인 커버리지가 가장 많이 사용되는 이유는?
만약 조건문에 존재하지 않는다면? -> 해당 코드들이 아예 테스트되지 않음
코드 커버리지가 중요한 이유?
테스트 코드가 중요한 이유와 비슷합니다.
테스트 코드는 발생할 수 있는 모든 시나리오에 대해 작성되어야 하지만 로직이 복잡한 경우에는 개발자가 이를 커버하지 못하는 부분이 발생할 수도 있습니다.
따라서 개발자(사람)가/이 놓칠 수 있는 부분들을 코드 커버리지를 통해 확인할 수 있습니다.
실제로도 소나큐브와 같은 정적 코드 분석 도구를 활용하여 코드 커버리지가 기존보다 떨어지는 경우 Commit이 불가능하도록 제한하기도 합니다.
이처럼 코드 커버리지는 코드의 안정성을 어느 정도 보장해 줄 수 있는 지표이기 때문에 많은 프로젝트에서 커버리지를 확인하고 관리, 적용하려고 노력합니다.
코드 커버리지 측정 도구
SonarQube
SonarSource에서 만든 SonarQube는 코드를 분석하여 중복, 테스트 커버리지, 코드 복잡도 , 버그, 보안 취약성 등을 리포팅해주며 IDE, 빌드 도그, CI와 통합하여 사용할 수 있습니다.
JaCoCo
JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리입니다.
테스트 코드를 돌리고 그 커버리지 결과를 눈으로 보기 좋도록 html, xml, csv 같은 리포트로 생성합니다.
또한 테스트 커버리지가 내가 설정한 기준을 만족하는지도 확인하는 기능이 있습니다.
출처
https://tecoble.techcourse.co.kr/post/2020-10-24-code-coverage/