[우아한테크코스] 8월 5일 TIL

1 minute read

[gradle] JACOCO

jacoco는 java의 코드 커버리지를 체크하고 결과를 html로 만들어주는 라이브러리입니다.

설정한 minimum, maximum 등이 통과하지 않으면 오류가 발생합니다.


1. jacoco 플러그인 추가

plugins {
  id 'jacoco'
}

jacoco {
  // JaCoCo 버전
  toolVersion = '0.8.5'

//  테스트결과 리포트를 저장할 경로
    reportsDir = ${project.reporting.baseDir}/jacoco
}


2. gradle task 설정

  • jacocoTestReport: 바이너리 커버리지 결과를 사람이 읽기 좋은 형태의 리포트로 저장합니다.

    html 파일로 생성해 사람이 쉽게 눈으로 확인할 수도 있고, SonarQube 등으로 연동하기 위해 xml, csv 같은 형태로도 리포트를 생성할 수 있습니다.

  • jacocoTestCoverageVerification: 내가 원하는 커버리지 기준을 만족하는지 확인해 주는 task입니다.

    예를 들어, 브랜치 커버리지를 최소한 80% 이상으로 유지하고 싶다면, 이 task에 설정하면 됩니다. test task처럼 Gradle 빌드의 성공/실패로 결과를 보여줍니다.

test {
    outputs.dir snippetsDir
    useJUnitPlatform()
    jacoco {
        destinationFile = file("$buildDir/jacoco/jacoco.exec")
    }
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test
    reports{
        html.enabled true
        xml.enabled false
        csv.enabled false
    }
    finalizedBy jacocoTestCoverageVerification
}

jacocoTestCoverageVerification {
    violationRules {
        rule {	//아래는 default 값입니다.
            element = 'BUNDLE'
              //없으면 프로젝트의 전체 파일을 합친 값

            limit {
                counter = 'INSTRUCTION'
                value = 'COVEREDRATIO'
                minimum = 0.90
            }
        }
    }
}

기본적으로 build 하면 build.gradle에 있는 task들이 돌아갑니다. 하지만 리포트를 제대로 보고 싶으면 test -> jacocoTestReport -> jacocoTestCoverageVerification 순서대로 진행하는 것이 좋고 이를 test에 finalizedBy 주면 jacocoTestReport 실행되고, jacocoTestReport에 finalizedBy 주면 jacocoTestCoverageVerification가 마지막에 실행됩니다.

task testCoverage(type: Test) {
  group 'verification'
  description 'Runs the unit tests with coverage'

  dependsOn(':test',
            ':jacocoTestReport',
            ':jacocoTestCoverageVerification')

  tasks['jacocoTestReport'].mustRunAfter(tasks['test'])
  tasks['jacocoTestCoverageVerification'].mustRunAfter(tasks['jacocoTestReport'])
}

위와 같이 설정하면 여러 task를 group으로 묶어서 함께 실행할 수도 있습니다.


3. Element 설정

  • BUNDLE (default): 패키지 번들
  • PACKAGE: 패키지
  • CLASS: 클래스
  • SOURCEFILE: 소스파일
  • METHOD: 메소드


4. counter 설정

  • LINE: 빈 줄을 제외한 실제 코드의 라인 수
  • BRANCH: 조건문 등의 분기 수
  • CLASS: 클래스 수
  • METHOD: 메소드 수
  • INSTRUCTION (default): Java 바이트코드 명령 수.
  • COMPLEXITY: 복잡도.


5. value 설정

  • TOTALCOUNT: 전체 개수
  • MISSEDCOUNT: 커버되지 않은 개수
  • COVEREDCOUNT: 커버된 개수
  • MISSEDRATIO: 커버되지 않은 비율. 0부터 1 사이의 숫자로, 1이 100%입니다.
  • COVEREDRATIO (default): 커버된 비율. 0부터 1 사이의 숫자로, 1이 100%입니다.


6. 제외 클래스 지정

    jacocoTestCoverageVerification {
        violationRules {
            rule {
                enabled = true // 활성화
                element = 'CLASS' // 클래스 단위로 커버리지 체크
                // includes = []                

                limit {
                }

                excludes = []
            }
        }
    }


7. 테스트 리포트 확인

./gradlew --console verbose test

옵션을 추가하면 우리가 추가한 gradle task가 정상적으로 동작하는지 볼 수 있습니다.

backend/build/reports/jacoco/test/html/index.html 로 들어가면 커버리지를 확인할 수 있습니다.