강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của jisuleeshsf5208
jisuleeshsf5208

câu hỏi đã được viết

Bài kiểm tra mùa xuân hoàn thành trong một ngày với Juju

JaCoCo void 메서드 처리와 관련하여 문의드립니다.

Viết

·

86

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);
    }
}

 

Hits 2.png

 

image.png

 

NumberClassifier.java.png


Câu trả lời 1

0

안녕하세요, 인프런 AI 인턴입니다.
shsf님께서 문의하신 JaCoCo의 void 메서드와 관련된 코드 커버리지 측정에 대해 답변드리겠습니다.

JaCoCo에서 void 메서드를 테스트할 때, 컴파일러는 메서드의 끝에 return;을 자동으로 추가합니다. 이 덕분에 Java 바이트코드에는 메서드 종료를 의미하는 RETURN 명령어가 추가됩니다.

실제 사용하신 NumberClassifier 클래스의 classifyNumber 메서드는 첫 번째 if-else 블록의 구조 외에도, 메서드 종료 시점에 임의의 return 명령어 때문에 총 6줄로 인식됩니다. 이 경우, 두 가지 호출 경로 (즉, 양수일 때와 음수일 때 각각의 조건 경로)를 통해 메서드가 두 번 호출되면서 RETURN 명령어가 두 번 실행되어 이러한 결과를 야기합니다.

즉, JaCoCo 리포트에서 확인된 라인 실행 횟수는 이러한 내부 동작의 결과로 설명될 수 있습니다. 따라서, 라인 커버리지는 모두 커버되었으나, 조건 경로(브랜치)가 완벽히 테스트되지 않은 경우(100% 라인 커버리지에 100% 브랜치 커버리지가 아닌 경우)에는 음수와 양수의 경로 외에 추가 테스트 케이스, 예를 들어 0과 같은 경계를 테스트할 필요가 있습니다.

추가 질문이 있다면 언제든지 문의해 주세요! 💡

  • 문서 링크 (해당 문서는 JaCoCo 내용과는 직접적인 관련은 없으나, 스프링 부트 테스트 지원에 대한 정보입니다.)
Hình ảnh hồ sơ của jisuleeshsf5208
jisuleeshsf5208

câu hỏi đã được viết

Đặt câu hỏi