[우아한테크코스] 8월 5일 TIL
[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에 설정하면 됩니다.
testtask처럼 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 로 들어가면 커버리지를 확인할 수 있습니다.