작성한 테스트 케이스들이 얼마나 대상을 커버했는지를 나타내는 지표입니다. 이를 통해 테스트가 부족한 코드들을 인지하고 필요하다면 테스트 코드를 추가적으로 작성할 수 있습니다.
코드 구문이 실행되었는가를 판단합니다.
export const statement = (x: number) => {
if (x > 5) {
return true;
}
return false;
};
와 같은 구문이 있을 때, x = 6인 경우만 테스트하는 경우, 마지막 구문인 return false;
는 실행되지 않기 때문에 구문 커버리지는 80%를 나타내게 됩니다.
모든 조건식의 내부 조건이 true/false를 한번씩 가지게되면 만족됩니다.
export const condition = (x: number, y: number) => {
if (x > 5 && y < 3) {
return true;
}
return false;
};
와 같은 경우, x = 6, y = 2
, x = 3, y =2
두가지 경우를 테스트하게되면 x > 5
와 y < 3
각각이 true/false를 한번씩 실행했기 때문에 조건 커버리지를 만족하게 됩니다. 이외에도 x = 4, y = 4
,x = 6, y = 2
인 경우 등 여러가지 케이스가 있습니다.
export const decision = (x: number, y: number) => {
if (x > 5 && y < 3) {
return true;
}
return false;
};
와 같은 경우 true를 리턴하는 케이스, false를 리턴하는 케이스 2가지가 실행되면 결정 커버리지를 만족합니다.
조건 커버리지를 개선시킨 것으로, 조건 커버리지의 개별 조건식 true/false 실행과 결정 커버리지를 합쳐놓은 형태입니다.
export const condition_decision = (x: number, y: number) => {
if (x > 5 && y < 3) {
return true;
}
return false;
};
와 같은 경우, x=6, y=2
와 x=4, y=4
두가지 케이스를 통해 개별 조건식의 true/false와 true 리턴, false리턴 케이스가 모두 테스트 되어집니다.
jest --coverage
명령어를 통해 코드 커버리지를 측정할 수 있습니다.
jest의 coverage에서는
statements
, branchs
, functions
. lines
총 4가지 커버리지를 제공합니다.
statements
위 구문 커버리지와 같습니다.
branchs
보통 branch 커버리지를 decision 커버리지라고 하는 글들도 있고, decision 커버리지는 conditional coverage만 확인하고, branch 커버리지는 unconoditional coverage까지 확인한다는 글도 있습니다. branch vs decision coverage
하지만 jest에서 branch 커버리지는 조금 다르게 동작하는 것 같습니다.
사용한 jest버전은 28.1.0버전이며 실험결과에 대한 개인적인 결론은 다음과 같습니다.
단일 조건인 경우, 해당 if문을 기준으로 if문 내부가 실행되었는가만 확인하는 것 같다. if문 내부로 들어가지 않을 경우, branch coverage가 0%가 나왔다.
하지만if(x > 5 && y < 3){}
과 같은 if문이 있을 때, 존재하는 branch는x > 5
,y < 3
,if문 내부 실행
이렇게 총 3가지가 실행되었는가를 보는 것 같다.
만약x = 6, y = 3
인 경우,x > 5
,y < 3
은 실행되지만if문 내부 실행
은 실행되지 않는다. 따라서 66.66%의 branch coverage가 나오게된다.
(개인적인 실험에 대한 의견입니다)
functions
해당하는 function이 실행되었는가를 확인합니다.
lines
줄별로 실행되었는가를 체크합니다.
const a = 1; console.log(123);
은 한개의 line, 두개의 statement 입니다.
마틴파울러의 글에서 보면
커버리지는 테스트가 부족한 부분을 찾고 개선하는데 가치가 있고, 커버리지가 높다고 무조건 코드 퀄리티가 높다고 말할 수는 없다.