JaCoCo

JaCoCo
JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리이다.
코드 커버리지란 작성한 test code가 본 코드를 얼마나 커버하고 있냐를 측정하는 지표이다.
테스트 코드를 돌린 후 html, csv, xml 리포트로 생성가능하다. 또한 설정한 커버리지 만족 기준을 설정하여 통과하여야만 하도록 설정할 수 있다.
CI 중 Test를 실행했을 때 커버리지를 만족하지 못할 경우 build를 못하게 하기 위함
JaCoCo 적용
JaCoCo 플러그인 적용
build.gradle 파일에서 작성
plugins { id 'jacoco' }JacocoTestReport 설정
jacocoTestReport{ reports { html.required = true xml.required = false csv.required = false html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } finalizedBy jacocoTestCoverageVerification }required: 생성 여부
outputLocation: 생성 위치
finalizedBy: jacocoTestReport 실행 후 다음 실행 task 지정
jacocoTestCoverageVerification 설정
```java jacocoTestCoverageVerification { violationRules { rule{ enabled = true element = 'CLASS'
limit { counter = 'BRANCH' value = "COVEREDRATIO" minimum = 0.8 } } } }
element가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다.
counter가 없으면 INSTRUCTION이 기본 값
value가 없으면 COVEREDRATIO)가 기본 값
여러 rule을 생성할 수 있다.
enabled를 통해 껐다 켰다 할 수 있음
element는 룰을 체크할 단위
limit은 제한 범위로 커버리지 만족도를 설정할 수 있음
**설정 옵션**
element
* BUNDLE (defalut): 패키지 번들
* PACKAGE: 패키지
* CLASS: 클래스
* SOURCEFILE: 소스파일
* METHOD: 메소드
counter
* LINE: 빈 줄을 제외한 실제 코드의 라인 수
* BRANCH: 조건문 등의 분기 수
* CLASS: 클래스 수
* METHOD: 메소드 수
* INSTRUCTION (default): Java 바이트코드 명령 수
* COMPLEXITY: 복잡도
value
* TOTALCOUNT: 전체 개수
* MISSEDCOUNT: 커버되지 않은 개수
* COVEREDCOUNT: 커버된 개수
* MISSEDRATIO: 커버되지 않은 비율. 0부터 1 사이의 숫자
* COVEREDRATIO (default): 커버된 비율. 0부터 1 사이의 숫자
**build.gradle 전체 코드**
```java
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.14'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'jacoco'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
jacoco {
toolVersion = '0.8.9'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation group: 'com.h2database', name: 'h2', version: '2.1.214'
// map struct 의존성
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor "org.mapstruct:mapstruct-processor:1.4.2.Final"
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
}
tasks.named('test') {
finalizedBy jacocoTestReport
useJUnitPlatform()
}
jacocoTestReport{
reports {
html.required = true
xml.required = false
csv.required = false
html.outputLocation = layout.buildDirectory.dir("jacocoHtml")
}
finalizedBy jacocoTestCoverageVerification
}
jacocoTestCoverageVerification {
violationRules {
rule{
element = 'CLASS'
limit {
counter = 'BRANCH'
value = "COVEREDRATIO"
minimum = 0.8
}
}
}
}
실행

test → jacocoTestReport → jacocoTestCoverageVerification 순으로 실행해야 함.

build.gradle 파일이 있는 곳에서 ./gradlew test 명령어로 테스트 task 실행
결과

초록색은 커버가 된 비율 빨간색은 커버 되지 않은 비율

초록색은 커버된 라인 빨간색은 커버되지 않은 라인
노란색도 있는데 노란색은 일부만 커버된 라인 ex) if문의 true값만 테스트 된 경우

코드 커버리지 조건을 만족하지 못해 build 오류 발생.


