프로그래밍/ETC

[JaCoCo] Springboot3.x.x 설정 및 커버리지 확인하기

심화과제 추가 요건 사항으로 Jacoco 를 적용하고 테스트 커버리지를 높이는 것이 있어

설정하고, 확인하는 방법을 쓰려고합니다.

 

우선 적용한 환경입니다.

 

- SpringBoot 3.1.5

- Gradle: 8.4

 


JaCoCo 플러그인 추가하기

build.gradle에서 JaCoCo 플러그인을 추가하고 설정합니다.

plugins {
    id 'jacoco'
    ... 다른 플러그인 id 
}

jacoco {
    // JaCoCo 버전
    toolVersion = "0.8.9"

//  테스트결과 리포트를 저장할 경로 변경
//  default는 "${project.reporting.baseDir}/jacoco"
//  reportsDir = file("$buildDir/customJacocoReportDir")
}

 

Gradle Task 설정 - 테스트 레포트 설정과 커버리지 체크 설정

 

JaCoCo 플러그인에는 jacocoTestReport 와 jacocoTestCoverageVerification task 가 존재합니다.

- jacocoTestReport: 커버리지 테스트 결과를 다양한 포맷(html, csv ,xml)의 리포트로 저장합니다.

- jacocoTestCoverageVerification: 원하는 커버리지 기준을 만조가는지 확인하는 task입니다.
달성해야할 커버리지 수치와 기준을 설정할 수 있습니다.

jacocoTestReport

//Jacoco 레포트 설정
jacocoTestReport {
    dependsOn test // test task 실행 시 해당 task도 실행됩니다.

    reports {
        // 원하는 리포트를 켜고 끌 수 있습니다.
        xml.required = false
        csv.required = false

        //html 생성 위치를 정합니다. /build/jacocoHtml/index.html 로 생성됩니다.
        html.outputLocation = layout.buildDirectory.dir('jacocoHtml')


//  각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있습니다.
//  html.destination file("$buildDir/jacocoHtml")
//  xml.destination file("$buildDir/jacoco.xml")
    }

    def Qdomains = [] //QueryDsl Q도메인 패턴입니다.
    for (qPattern in '**/QA'..'**/QZ') {
        Qdomains.add(qPattern + '*')
    }
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [  //테스트 레포트 제외 대상입니다.
                    "**/*Application*",
                    "**/*Config*",
                    "**/*Dto*",
                    "**/*Response*",
                    "**/*Interceptor*",
                    "**/*Exception*",
                    "**/*Filter*"
            ] + Qdomains)
        }))
    }
    finalizedBy 'jacocoTestCoverageVerification' 
}

보시는바와 같이 reports 설정과, report 대상을 특정할 수 있습니다.

 

jacocoTestCoverageVerification

jacocoTestCoverageVerification { //테스트 커버리지 측정 관련 설정입니다.
    def Qdomains = [] //QueryDsl Q도메인 제외 패턴
    for (qPattern in '*.QA'..'*.QZ') {
        Qdomains.add(qPattern + '*')
    }
    violationRules {
        rule {
            element = 'CLASS'
            enabled = true
            limit {                //커버리지 측정 기준 라인 수 60% 이상
                counter = 'LINE'
                value = 'COVEREDRATIO'
                minimum = 0.60
            }

            excludes = [   //측정 제외 목록
                    "**.*Application*",
                    "**.*Config*",
                    "**.*Dto*",
                    "**.*Response*",
                    "**.*Interceptor*",
                    "**.*Exception*",
                    "**.*Filter*"
            ] + Qdomains
        }
    }
}

아래는 rule 관련 정리한 내용입니다.

element

Coverage의 기준이 되는 값입니다.

BUNDLE : Default
PACKAGE
CLASS
SOURCEFILE
METHOD

counter

아래의 조건으로 코드를 수치화 합니다.

INSTRUCTION : Default, Java 바이트 코드 명령 수 입니다.
LINE : 빈 줄을 제외한 라인 수
BRANCH : 조건 문 등의 분기 수
CLASS : 클래스 수
METHOD : 메소드 수
COMPLEXITY : 복잡도(계산법)

 

JaCoCo - Coverage Counter

Coverage Counters JaCoCo uses a set of different counters to calculate coverage metrics. All these counters are derived from information contained in Java class files which basically are Java byte code instructions and debug information optionally embedded

www.eclemma.org

 

위의 설정을 다 하시면 test task 실행시 jacoco html이 만들어집니다.

 

test -> jacocoTestCoverageVerificiation -> jacocoTestReport 순으로 task 가 진행되게 됩니다.

작업이 끝나면

 

jacocoHtml/index.html  이생성되게 됩니다.

해당 파일을 열어주시면

 

테스트 코드의 커버리지를 확인할 수 있습니다.

728x90