jacoco 사용시 특정 클래스를 커버리지 테스트에서 제외하고 싶었는데 잘 되지 않았다.
jacocoTestCoverageVerification {
violationRules {
rule {
element = 'CLASS'
limit {
counter = 'LINE'
value = 'TOTALCOUNT'
maximum = 8
}
// 커버리지 체크를 제외할 클래스들
excludes = [
// '*.test.*',
'*.Kotlin*'
]
}
}
}
이것을 적용하려고 했는데 실제 결과에는 제외되지 않고 커버리지를 측정했다. 그래서 제외시킬수 있는 방법을 찾아야 했다. 그리고 롬복으로 생성된 코드 역시 커버리지 분석을 하기 때문에 이 부분도 제외할 수 있는 방법을 찾아야한다.
Jacoco에서는 @lombok.Generate 라는 어노테이션이 있다면 커버리지 분석에서 제외된다. 이를 롬복으로 생성된 코드마다 어노테이션을 붙여주는 설정이 있다.
우선 root 디렉토리에 lombok.config 파일을 생성한다.
그 이후 다음과 같이 설정해준다.
lombok.addLombokGeneratedAnnotation = true
이렇게 설정해주면 커버리지에서 Lombok으로 생성된 코드때문에 커버리지율이 떨어질 일은 없다.
특정 클래스를 제외하려면
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it,
exclude: [
'**/MecaApplication.*'
])
}))
}
reports {
xml.enabled true
html.enabled true
csv.enabled true
}
finalizedBy 'jacocoTestCoverageVerification'
}
jacocoTestReport는 테스트 커버리지 리포트를 생성하는데 필요한 설정이다. afterEvaluate에서 classDirectories에서 exclude를 세팅하면 리포트 생성시 특정 클래스의 커버리지를 리포트에서 제외할 수 있다.
위에 설정에서 finalizedBy에서 jacocoTestCoverageVerification를 호출하는 이유는 report 생성시 마지막으로 jacocoTestCoverageVerification을 수행하라는 의미이다. jacocoTestCoverageVerfication은 테스트 커버리지가 특정 rule를 만족하지 않으면 실패하는데 이게 다른 task나 동작 사이에 껴있으면 같이 실패하게 만든다. 만약 test task에 verfication을 추가하면 test중에 커버리지 룰을 만족하지 못하면 통과하지 못하게 할 수 있다 따로 넣지 않는다면 리포트만 생성하고 커버리지 룰은 적용하지 않게도 만들 수 있다.