구문 커버리지(Statement Coverage)
라인(Line) 커버리지라고 부르기도 한다. 코드 한 줄이 한번 이상 실행된다면 충족된다.
void test(int n) {
// 함수 A 실행 - 1번
if (n > 0) { //- 2번
// 함수 B 실행 - 3번
}
// 함수 C 실행 - 4번
}
위에의 코드를 n 이 음수로 들어오는 테스트 하나만 했다고 하자. 그러면 1~4번 구문중 3번 구문이 실행이 안돼서 구문 커버리지는 3 / 4 * 100% = 75% 인 테스트가 된다.
조건 커버리지(Condition Coverage)
여기서의 조건은 모든 조건식을 얘기한다. 내부 조건이 true/false의 경우를 충족하는 지를 본다.
void test(int a, int b) {
// 함수 A 실행 - 1번
if (a > 0 && b < 0) { //- 2번
// 함수 B 실행 - 3번
}
// 함수 C 실행 - 4번
}
여기서 내부 조건이란 조건 식 내부의 각각의 조건이다. 즉, a > 0 과 b < 0를 얘기하며 각각이 true/false의 경우가 있으면 조건 커버리지를 만족한다.
위에 코드를 테스트하기 위해 a = 1, b = 1 과 a = -1, b = -1를 넣어보는 테스트를 만들었다고 해보자. 내부 조건식 a > 0와 b < 0 는 모두 양수일 때와 음수일 때 테스트 케이스가 존재하므로 조건 커버리지를 만족한다.
하지만 a > 0 && b < 0는 두 경우 모두 false 이므로 함수 B 실행의 구문이 들어간 경우는 테스트가 안되는 결과가 발생한다.
이처럼 테스트를 작성했을 때 조건 커버리지를 만족하더라도 구문 커버리지와 이후에 나올 결정 커버리지를 만족하지 못하는 경우가 존재한다.
결정 커버리지(Decision Coverage)
브랜치(Branch) 커버리지라고 부르기도 한다. 모든 조건식이 true/false를 가지게 되면 충족된다.
void test(int a, int b) {
// 함수 A 실행 - 1번
if (a > 0 && b < 0) { //- 2번
// 함수 B 실행 - 3번
}
// 함수 C 실행 - 4번
}
조건 커버리지에서의 예시를 다시 가져와보자. a = 1, b = 1 과 a = -1, b = -1를 넣어보는 테스트를 했을 때 조건 커버리지가 만족되더라도 함수 B가 실행되지 않았던 결과가 있었다. 결정 커버리지를 만족한다면 이런 문제는 없을 것이다. 그 이유는 결정 커버리지에서 결정은 내부 조건이 아닌 조건식을 얘기한다. 즉, 위에 코드에서는 a > 0 && b < 0를 얘기한다.
따라서 결정 커버리지를 만족하는 테스트를 만든다고 한다면 a = 1, b = 1 과 a = -1, b = -1와 같이 조건식이 false만 나오는 식이 아닌 a = 1, b = -1 를 넣는 테스트를 만들어야한다. 이 테스트 케이스를 넣게되면 조건 커버리지와 결정 커버리지, 구문 커버리지를 모두 만족할 수 있게된다.
'Backend > Spring' 카테고리의 다른 글
| 스프링 Security (0) | 2025.04.12 |
|---|---|
| [Spring] HTTP 통신구조 기초 이해 (0) | 2025.03.14 |
| [Spring] Websocket을 활용한 STOMP (0) | 2025.03.11 |
| [Spring]oAuth2를 이용한 카카오 로그인 (1) | 2025.03.10 |
| JWT를 활용한 서버 토큰 (4) | 2024.08.26 |