테스트 코드의 중요성은 많은 개발자가 알고 있다.
오늘은 이전에 만든 프로젝트에 jacoco 를 적용시켜서 내가 작성한 테스트 코드가 커버리지가 어느 정도인지 파악해볼려고 한다.
JaCoCo

JaCoCo is a free code coverage library for Java, which has been created by the EclEmma team based on the lessons learned from using and integration existing libraries for many years - JaCoCo
JaCoCo는 자바 코드 커버리지를 체크하는 데에 사용되는 오픈소스 라이브러리이다.
JaCoCo의 버전은 Maven Central Repository를 통해 확인할 수 있습니다. 작성일(20.10.05) 기준, 최신 버전은 0.8.6입니다.
JaCoCo의 특징
JaCoCo가 가지는 특징으로는
- Line, Branch Coverage를 제공한다.
- 코드 커버리지 결과를 보기 좋도록 파일 형태로 저장할 수 있다.
- html, xml, csv 등으로 Report를 생성할 수 있다.
- 설정한 커버리지 기준을 만족하는지 확인할 수 있다.
등이 있다.
이러한 특징들은 코드 커버리지를 쉽게 확인하고 관리할 수 있도록 도와준다.
JaCoCo 적용
개발 환경
- Java 11
- Spring Boot 2.7.5
- Gradle 7.5.1
Jacoco 플러그인 설치
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.1.0'
id 'jacoco' 플러그인 추가
}
tasks.named('test') {
jacoco {
destinationFile = file("$buildDir/jacoco/jacoco.exec")
}
useJUnitPlatform()
finalizedBy 'jacocoTestReport'
}
jacoco {
// JaCoCo 버전
toolVersion = '0.8.8'
// 테스트결과 리포트를 저장할 경로 변경
// default는 "$/jacoco"
// reportsDir = file("$buildDir/customJacocoReportDir")
}
Jacoco 플러그인 설정
JacocoTestReport
바이너리 커버리지 결과를 사람이 읽기 좋은 형태의 리포트로 저장해주는 Task이다.
jacocoTestReport {
reports {
// 원하는 리포트를 켜고 끌 수 있다.
xml.enabled(true)
html.enabled(true)
xml.destination(new File("build/reports/jacoco.xml"))
}
finalizedBy 'jacocoTestCoverageVerification'
}
JacocoTestCoverageVerification
원하는 커버리지 기준을 만족하는지 확인해 주는 Task이다.
현재 지정은 0.3으로 이보다 coverage가 낮을 경우 빌드가 실패한다.
jacocoTestCoverageVerification {
violationRules {
rule {
// 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다.
limit {
// 'counter'를 지정하지 않으면 default는 'INSTRUCTION'
// 'value'를 지정하지 않으면 default는 'COVEREDRATIO'
minimum = 0.30
}
}
rule {
// 룰을 간단히 켜고 끌 수 있다.
enabled = true
// 룰을 체크할 단위는 클래스 단위
element = 'CLASS'
}
}
}
finalizedBy란?
task 순서를 설정하기 위해 사용한다.
만약 task가 jacocoTestCoverageVerification가 JacocoTestReport 보다 먼저 실행되면 리포트 생성 이전에 coverage를 체크하게 된다.
이런 불상사를 예방하기 위해 각 task 사이의 의존성 설정하기 위해서 사용한다
테스트 실행
빌드 해보면서 jacoco 적용을 확인해 본다

build를 해본 결과 test task에서 빌드가 실패 했음을 알 수 있다.
바로 레포트를 확인하자
레포트는 build\reports\jacoco\test\html\index.html에서 확인 할 수 있다.
레포트 결과

비즈니스 로직 같은 곳에서는 어느정도 coverage가 나왔지만 utils,configuration과 같은 설정 파일을 보관한 곳까지 같이
coverage를 분석해서 빌드에 실패했다.
이러한 내용을 방지하기 위해선 jacocoTestCoverageVerification에서 excludes 설정을 하면 해결 할 수 있다.


이런식으로 클래스, 메서드 별로 어느 부분이 TestCode가 부족한지 체크할 수 있어 test 코드 작성 시 도움이 많이 될 것 같다.
정리
코드 커버리지 체크를 해봤다
나름 테스트코드를 작성했다고 생각했는데 coverage가 많이 부족해서 조금 놀랐다..
다른 기술블로그를 찾아본 결과 coverage는 보통 80%이상 심지어 100% 까지 되는 브랜치도 있다고 하는데
아직 테스트 코드 작성이 많이 부족함을 느낄 수 있었다.
다음 프로젝트 부터는 테스트 코드 작성을 조금 더 빡쎄게 해봐야 겠다!