작성
·
60
0
강사님 안녕하세요 :)
JaCoCo 설정 후 ‘라인 커버리지가 100%일 때 브랜치 커버리지가 100%가 아닌 경우’를 테스트 중입니다.
void 반환 타입의 경우, 메서드 종료를 위해 컴파일러가 메서드 마지막에 return;을 추가하는 것으로 이해하고 있습니다. 이때 JaCoCo 코드 커버리지 리포트 내 라인이 5줄(#1~5)이 아닌 6줄(#1~6)로 인식되는 것은 컴파일러가 return;을 추가한 후 테스트 실행 시 바이트 코드 내 RETURN이 2번 Hit되었기 때문인지요?
@NoArgsConstructor
public class NumberClassifier {
public static void classifyNumber(int num) {
System.out.println("num = " + num); // #1
if (num > 0) { // #2
System.out.println("Positive"); // #3
} else if (num < 0){ // #4
System.out.println("Negative"); // #5
}
} // #6
}
public class NumberClassifierTest {
@DisplayName("")
@Test
void classifyNumber() {
NumberClassifier.classifyNumber(1);
NumberClassifier.classifyNumber(-1);
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
shsf님께서 문의하신 JaCoCo의 void 메서드와 관련된 코드 커버리지 측정에 대해 답변드리겠습니다.
JaCoCo에서 void 메서드를 테스트할 때, 컴파일러는 메서드의 끝에 return;
을 자동으로 추가합니다. 이 덕분에 Java 바이트코드에는 메서드 종료를 의미하는 RETURN 명령어가 추가됩니다.
실제 사용하신 NumberClassifier
클래스의 classifyNumber
메서드는 첫 번째 if-else 블록의 구조 외에도, 메서드 종료 시점에 임의의 return 명령어 때문에 총 6줄로 인식됩니다. 이 경우, 두 가지 호출 경로 (즉, 양수일 때와 음수일 때 각각의 조건 경로)를 통해 메서드가 두 번 호출되면서 RETURN 명령어가 두 번 실행되어 이러한 결과를 야기합니다.
즉, JaCoCo 리포트에서 확인된 라인 실행 횟수는 이러한 내부 동작의 결과로 설명될 수 있습니다. 따라서, 라인 커버리지는 모두 커버되었으나, 조건 경로(브랜치)가 완벽히 테스트되지 않은 경우(100% 라인 커버리지에 100% 브랜치 커버리지가 아닌 경우)에는 음수와 양수의 경로 외에 추가 테스트 케이스, 예를 들어 0과 같은 경계를 테스트할 필요가 있습니다.
추가 질문이 있다면 언제든지 문의해 주세요! 💡