코드 커버리지 (Code Coverage)
✔️ 코드 커버리지 (Code Coverage)
테스트 케이스들이 프로덕션 코드를 실행한 정도를 나타냅니다.
코드 커버리지
는 측정하는 기준에 따라서 크게 구문 커버리지(Statement Coverage)
, 결정 커버리지(Decision Coverage)
, 조건 커버리지(Condition Coverage)
로 나뉩니다.
1) 구문 커버리지 (Statement Coverage)
라인 커버리지 (Line Coverage)
라고도 불립니다. 단순히 프로덕션 코드의 라인이 실행된 것을 확인합니다. 예를 들어, 5줄의 코드를 포함하는 A 메서드를 테스트했는데, 5줄 모두 실행된 경우 구문 커버리지
는 100%가 됩니다.
2) 결정 커버리지(Decision Coverage)
브랜치 커버리지(Branch Coverage)
라고도 불립니다. 이는 프로덕션 코드에 모든 조건식이 참이거나 거짓으로 평가되는 케이스가 최소 한 번씩 실행되는 것을 판단합니다. 예를 들어 아래와 같은 코드가 존재했을 때, 조건식이 참과 거짓으로 평가시킬 수 있는 테스트 케이스를 작성해야 결정 커버리지 기준을 만족합니다. 예를 들어, productionCode(1, 1)
, productionCode(0, 1)
인 경우, 결정 커버리지
를 만족합니다. 결정 커버리지
는 코드 내에서 실행 흐름이 분기되는 모든 경로를 테스트하는 것을 목표로 합니다.
public void productionCode(int a, int b) {
if (a > 0 && b > 0) { // 조건식
}
}
3) 조건 커버리지(Condition Coverage)
메서드 내부의 모든 조건식이 참과 거짓으로 모두 평가되는 것을 의미합니다. 예를 들어, 위 코드에서 결정 커버리지
는 a > 0 && b > 0
을 참과 거짓으로 평가할 수 있는 케이스가 있어야 하는 반면에, 조건 커버리지
는 a > 0
, b > 0
각각의 조건이 참과 거짓으로 평가되는지 확인합니다. productionCode(1, 0)
, productionCode(0, 1)
를 입력하는 상황처럼 조건 커버리지
는 만족하여도 다른 커버리지는 만족하지 못할 수 있는 상황도 존재합니다.
✔️ 커버리지가 높다고 무조건 좋을까? 🤔
커버리지가 높다는 것은 코드의 일부가 테스트에 의해 실행되어 검증되었다는 것을 의미합니다. 높은 커버리지는 일반적으로 코드의 안정성과 신뢰성을 높일 수 있지만, 이것이 무조건 항상 좋다고 말할 수는 없습니다. 억지로 커버리지를 높이다 보면 테스트 코드가 복잡해지고 가독성이 떨어질 수도 있습니다.
또한, 커버리지가 높다고 해서 모든 버그를 찾아낼 수 있는 것은 아닙니다. 커버리지가 높더라도 테스트 케이스가 부족하거나 부적절하게 작성되었다면 여전히 중요한 버그가 발생할 수 있습니다. 또한, 모든 코드를 테스트하는 것이 현실적이지 않을 수도 있습니다. 특히 예외 상황이나 경계 조건을 모두 다루기는 어려울 수 있습니다.