본문 바로가기
백엔드

[Spring Boot] Jacoco - 코드 커버리지

by 육빔 2024. 9. 8.
728x90
반응형

벡엔드 영상이나 프로젝트 등을 보면 자주 등장하는 코드 커버리지를 80% 이상을 ~~ 이런 말이 보통 자주 나오게 된다. 이런 상황에서 코드 커버리지가 정확히 무엇인지 파악하고 Jacoco를 적용하는 시간을 가져보자.

 

일단 코드 커버리지란?

 

테스트에서 얼마나 많은 코드가 실제로 테스트되었는지를 측정하는 지표이다. 이를 통해 테스트가 소스 코드의 어느 부분을 검증하고 있는지, 어떤 부분이 테스트되지 않았는지를 파악할 수 있고 보통 4가지 측면에서 측정이 된다.

 

 

  • 라인 커버리지: 소스 코드에서 각 줄이 테스트를 거쳤는지 측정.
  • 분기 커버리지: if, else와 같은 조건문에서 모든 분기가 테스트되었는지 측정.
  • 메소드 커버리지: 메소드 단위로 테스트가 수행되었는지 측정.
  • 클래스 커버리지: 클래스 단위로 테스트가 수행되었는지 측정.

 

스프링에서 주로 사용되는 Jacoco는 좀 더 커버리지를 한눈에 볼 수 있도록 파일 형태로 제공이 된다. 이제 어떻게 적용시키는지 알아보자. gradle 기준으로 적었다.

 

 

일단 우리가 설정해야 될 것은 jacocoTestReport, jacocoTestCoverageVerification이다.

두개를 설명해보자면 jacocoTestReport는 우리가 test기반으로 커버리지를 측정하여 레포드 형식으로 나오게 도와주는 설정이고, jacocoTestCoverageVerification는 만약 우리가 지정한 커버리지 기준을 못넘는다? 그러면 빌드 조차 안되게 설정이 가능하다.

 

 

 

우선 Jacoco 플러그인을 추가해준다.

plugins {
    id 'java'
    id 'jacoco'  // Jacoco 플러그인 추가
}

 

그 다음 우리는 테스트가 전부 끝난다음에 Jacoco를 적용해야함으로 test안에 jacocoTestReport설정을 넣어주자. 

 

jacocoTestReport {
    dependsOn test  // 테스트가 완료된 후 리포트를 생성하도록 설정
    reports {
        xml.required = true  // XML 리포트 생성
        csv.required = false  // CSV 리포트 비활성화
        html.outputLocation = file("$buildDir/reports/jacoco")  // HTML 리포트 경로 설정
    }
}

 

또한 dto나 repository와 같이 별로 테스트하는 의미가 없는 경우엔 아래처럼 특정클래스나 특정 위치에 있는 클래스를 제외하고 TestReport에 넣어줄 수 있다.

jacocoTestReport {

    getClassDirectories().setFrom(
            files(classDirectories.files.collect {
                fileTree(
                        dir: it,
                        exclude: [
                                '**/Application.class',
                                '**/dto/*.class',
                                '**/repository/*.class'
                        ]
                )
            }
            )
    )
    finalizedBy 'jacocoTestCoverageVerification'
}

그러면 저렇게 파일이 생기는 것을 볼 수 있다.

 

index.html을 실행해보면 이런식으로 테스트를 죽어도 안했구나라는 것을 한눈에 볼 수 있고 저 부분을 많이 해야겠구나.. 라는게 보인다.

 

그리고 jacoco-session.html이 있는데 이걸 보는 경우는 단위테스트, 통합테스트, 시스템테스트에 걸쳐 확일할때 필요하다. 좀 정리하면

단일 세션에서 테스트가 이루어지기 때문에 이 파일을 깊이 분석할 필요는 없지만, 테스트가 여러 세션에 걸쳐 실행된 경우라면 이 파일을 통해 각각의 세션이 어떻게 코드에 영향을 미쳤는지 확인할 수 있다. 

 

그리고 만약 이렇게 0퍼센트면 아예 빌드가 안되게 하고 싶은 경우가 분명히 있을 것이다. TDD를 원하거나 규칙을 정해서 진행하는 경우에는 아래와 같은 설정을 진행해주면 된다.

 

jacocoTestCoverageVerification {
    violationRules {
        rule {
            // 라인 커버리지 (기본)
            limit {
                minimum = 0.80  // 라인 커버리지 최소 80%
            }
        }
        rule {
            element = 'BRANCH'  // 분기 커버리지
            limit {
                minimum = 0.70  // 분기 커버리지 최소 70%
            }
        }
        rule {
            element = 'METHOD'  // 메소드 커버리지
            limit {
                minimum = 0.75  // 메소드 커버리지 최소 75%
            }
        }
        rule {
            element = 'CLASS'  // 클래스 커버리지
            limit {
                minimum = 0.90  // 클래스 커버리지 최소 90%
            }
        }
    }
}

 

아까 위에서 본 커버리지 기준으로 설정하면 그 기준 이하라면 빌드가 안되는 것을 확인 할 수 있다.

728x90
반응형