오늘은 jacoco에 대해서 공부를하고 Jacoco를 적용할 것이다.
코드 커버리지란 자바 코드를 얼마나 테스트를 하였는지 나타내는 지표 중 하나이다. 수치로 확인할 수 있다.
코드 커버리지 측정 도구는 개발자가 직접 확인해야하는 테스트 요소를 대신해서 측정해주는 도구다. 단순히 측정 뿐만이 아닌, 추가적인 기능을 제공한다.
테스트 커버리지 경과를 html, csv, xml 등과 같은 파일로 Export 해준다.
설정한 커버리지 수치를 만족하지 못하면 배포가 불가능하게 할 수 있다.
설정한 커버리지 수치를 만족하지 못하면 빌드가 불가능하게 할 수 있다.
Jacoco는 수많은 측정 도구 중 하나이다.
가장 많은 레퍼런스를 가지고 있다. 그리고 가장 많은 점유율을 가지고 있으며, 오픈소스이다.
Jacoco를 Spring에 적용해보자.
plugins {
id 'org.springframework.boot' version '2.7.1'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
//jacoco
id 'jacoco'
}
//jacoco 버전 명시
jacoco {
toolVersion = '0.8.6'
}
이렇게하고 gradle을 새로고침하면 Task에 2개가 추가된다.
커버리지 기준을 확인해주는 Task다.
커버리지 결과를 사람이 읽기 좋은 형태로 리포트 저장해주는 Task다.
테스트 결과를 리포트 파일로 저장하기 위해서 설정을 해야한다.
jacoco는 html, csv, xml 형태를 지원해준다. csv나 xml은 소나큐브와 연동이 가능하다.
reports {
html.enabled true
csv.enabled true
xml.enabled false
}
html은 사람이 보기 좋아서 사용하고, csv는 소나큐브를 위해서 사용해보자!
리포트 결과는 기본적으로 다음의 경로로 저장된다.
${project.reporting.baseDir}/jacoco
리포트 결과 저장경로를 따로 설정해주고 싶으면 다음과 같이하자.
reports {
html {
enable true
destination file('build/reports/~~.html')
}
}
이게 핵심이다. 코드 커버리지에 대한 추 후 작업을 설정해주어야 한다.
jacocoTestCoverageVerification {
violationRules {
rule {
enable = true
// 클래스 단위로 테스트 커버리지 측정
element = 'CLASS'
// 분기 커버리지 100%
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 1.00
}
// 문장 커버리지 80%
limit {
counter = 'LINE'
value = 'COVEREDRATIO'
minimum = 0.80
}
// 스프링 부트 메인 메소드 제외
excludes = ['com.everyboard.board.BoardApplication']
}
}
rule 활성화 여부를 나타내는 것이다. default 값은 true이다.
커버리지를 체크할 기준을 정하는 것이다. 6가지가 존재한다.
- BUNDLE : 패키지 번들
- CLASS : 클래스
- GROUP : 논리적 번들 그룹
- METHOD : 메서드
- PACKAGE : 패키지
- SOURCEFILE : 소스 파일
해당 rule의 적용 대상을 package 수준으로 정의할 수 있다.
- BRANCH : 조건문 등의 분기 수
- CLASS : 클래스 수, 내부 메서드가 1번이라도 실행하면 실행된 것으로 간주
- COMPLEXITY : 복잡도
- INSTRUCTION : Java 바이트코드 명령 수
- METHOD : 메서드 수
- LINE : 빈 줄을 제외한 실제 코드의 라인 수
DEFAULT는 INSTRUCTION이다.
- COVEREDCOUNT : 커버된 개수
- COVEREDRATIO : 커버된 비율, 0~1사이로 표현가능하다.
- MISSEDCOUNT : 커버되지 않은 개수
- MISSEDRATIO : 커버되지 않은 비율, 0~1사이로 표현가능하다.
- TOTALCOUNT : 전체 개수
DEFAULT는 COVEREDRATIO이다.
minimum
이 값을 통해서 jacocoTestCoverageVerification의 성공 여부가 결전된다.
exclueds
커버리지를 제외할 클래스를 설정할 수 있다.
순서는
test
jacocoTestReport
jacocoTestCoverageVerification
순서로 실행하여야 한다.
그러기 위해서는 "finalizedBy" 구문을 통해서 수행하여야 한다.
test {
useJUnitPlatform()
finalizedBy 'jacocoTestReport' //추가
}
jacocoTestReport {
...
finalizedBy 'jacocoTestCoverageVerification' // 추가
}