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