테스트 커버리지는 테스트가 실행될 때 코드에 어떤 부분이 테스트 되었고, 어떤 부분이 테스트되지 않았는지 확인하여 코드가 얼마나 철저하게 테스트 되었는지 확인할 수 있다. 개발자도 사람이므로 테스트를 커버하지 못하는 부분이 발생할 수 있고, 복잡한 코드에서는 간과할 수 있는 부분이 있을 수 있다. 따라서 테스트 커버리지를 확인해 휴먼 에러를 최대한 최소화하는 것이 좋다.
짝수를 판단하는 예제 코드로 각 커버리지의 기준을 알아보자.
// isEven.js
function isEven(number) {
if (number % 2 === 0) {
return true; // 짝수
} else {
return false; // 홀수
}
}
// isEven.test.js
import { isEven } from "./isEven";
it("isEven", () => {
expect(isEven(2)).toBeTruthy();
});
// 테스트 커버리지
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 75 | 50 | 100 | 75 |
isEven.js | 75 | 50 | 100 | 75 | 5
----------|---------|----------|---------|---------|-------------------
구문 커버리지는 테스트에서 실행된 코드 문의 비율을 측정한다. 4개의 코드 문이 있고 테스트 중에 3개의 문이 실행되었다면 구문 커버리지(%Stmts)
는 75%
가 된다.
if-else
, switch-case
그리고 삼항 연산자
를 사용할 때 조건 분기의 각 경로가 테스트되었는지 평가한다. 예제 코드에서if
문은 테스트되고 else
문은 테스트가 되지 않았다면 조건 커버리지는 50%
가 된다.
테스트 중에 코드의 각 함수가 한 번이상 호출되었는지 평가한다. isEven
함수 하나만 존재하며, 해당 함수가 호출되어 테스트 되었으므로 %Funcs
는 100%
가 된다.
테스트 중에 실행된 코드 라인의 비율을 측정한다. 4줄의 코드에서 3줄이 테스트 되었으면 라인 커버리지(%Line)은 75%
가 된다.
테스트 코드의 중요성을 이해하고 더 높은 테스트 커버리지를 달성하려고 노력한다면 자연스레 코드 퀄리티가 향상되고 기술 부채를 줄일 수 있으며 보다 안정적이고 유연한 프로젝트를 만들 수 있다고 생각한다.😁