안녕하세요. J4J입니다.
이번 포스팅은 Jacoco를 이용하여 테스트 커버리지 확인하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
Jacoco란?
Jacoco는 제목에서도 알 수 있는 것처럼 Spring에서 개발된 자바 소스의 테스트 커버리지를 확인하기 위해 사용되는 오픈소스 라이브러리입니다.
여기서 커버리지(Coverage) 라고 하는 것은 단어를 해석해 보면 "적용 범위"를 뜻하는 것을 알 수 있으며, 결국 테스트 커버리지라고 하는 것은 테스트 케이스가 작성된 소스 코드 범위를 뜻하는 것을 알 수 있습니다.
즉, Jacoco를 활용한다면 프로젝트에서 작성된 테스트 코드들이 전체 소스 코드 중 어느 수준까지 적용되고 있는 것을 확인할 수 있게 되고 커버리지 비율이 높을수록 전체 소스에 대한 테스트 케이스가 많이 작성된 것을 알 수 있습니다.
Jacoco를 Spring에 꼭 사용해야 하는 것은 아닙니다.
하지만 프로젝트의 규모가 커지고, 서비스 운영을 하면서 여러 기능들이 수정 및 추가가 될 때 테스트 코드 작성은 개발자들에게 많은 도움을 줍니다.
이런 상황에서 Jacoco를 활용하게 된다면 우리 서비스의 테스트 케이스 수준이 어느정도인지를 쉽게 확인할 수 있고, 또한 어느 코드가 테스트 케이스에 사용되고 있지 않은 것도 확인할 수 있기 때문에 많은 도움을 받을 수 있습니다.
기본 설정
들어가기에 앞서 Jacoco 설정은 버전에 영향을 받는 부분들이 있을 수 있습니다.
현재 제가 설정하고 있는 환경은 Java 17, Boot 3.1.3 이니 참고 부탁드립니다.
[ 1. build.gradle 수정 ]
plugins {
id 'jacoco'
}
tasks.named('test') {
useJUnitPlatform()
finalizedBy 'jacocoTestReport' // test가 끝나면 jacocoTestReport 동작
}
// jacoco report 설정
jacocoTestReport {
reports {
// html로 report 생성하기
// 빌드경로/jacoco/report.html 폴더 내부로 경로 설정
html.destination file("$buildDir/jacoco/report.html")
}
// jacocoTestReport가 끝나면 jacocoTestCoverageVerification 동작
finalizedBy 'jacocoTestCoverageVerification'
}
// jacoco 커버리지 검증 설정
jacocoTestCoverageVerification {
violationRules {
rule {
enabled = true // 커버리지 적용 여부
element = 'CLASS' // 커버리지 적용 단위
// 라인 커버리지 설정
// 적용 대상 전체 소스 코드들을 한줄 한줄 따졌을 때 테스트 코드가 작성되어 있는 줄의 빈도
// 테스트 코드가 작성되어 있는 비율이 90% 이상이어야 함
limit {
counter = 'LINE'
value = 'COVEREDRATIO'
minimum = 0.90
}
// 브랜치 커버리지 설정
// if-else 등을 활용하여 발생되는 분기들 중 테스트 코드가 작성되어 있는 빈도
// 테스트 코드가 작성되어 있는 비율이 90% 이상이어야 함
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.90
}
// 라인 최대 갯수 설정
// 빈 줄을 제외하고 하나의 자바 파일에서 작성될 수 있는 최대 라인 갯수
// 한 파일에 최대 500줄까지 작성되어야 함
limit {
counter = 'LINE'
value = 'TOTALCOUNT'
maximum = 500
}
}
}
}
[ 2. 테스트 실행 후 보고서 확인 ]
위와 같이 설정을 한 뒤 작성해둔 테스트 코드가 있다면 테스트 코드를 실행해 줍니다.
정상적으로 동작이 될 경우 다음과 같이 커버리지 보고서 결과물을 확인할 수 있습니다.
커버리지 비율 확인은 index.html 파일을 통해 확인해볼 수 있습니다.
커버리지 적용 범위 설정
작성된 소스 코드가 적은 경우 크게 불편함이 없지만 작성되는 소스가 많아지면 많아질수록 표현되는 것들이 많아지기 때문에 커버리지 적용이 필요 없는 파일들을 제거하고 싶은 욕구가 생기게 됩니다.
가장 대표적인 예시로 DTO, Entity 등의 파일들이 있습니다.
일반적으로 테스트 코드를 작성할 때는 비즈니스 로직에 영향을 미치는 코드를 작성하기 마련인데 DTO, Entity와 같은 파일들은 테스트와 관련돼서 확인할 필요가 있는 것들이 없습니다.
그렇기 때문에 다음과 같이 추가 설정을 통해 적용 범위를 정해보도록 하겠습니다.
[ 1. build.gradle 수정 ]
// jacoco report 설정
jacocoTestReport {
// 커버리지 보고서 제외 범위 설정
getClassDirectories().setFrom(
files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'**/dto' // dto package 내부는 제외
])
})
)
}
[ 2. 적용 전, 후 확인 ]
적용 전 보고서는 다음과 같습니다.
하지만 적용 후 보고서는 다음과 같이 변경되었습니다.
IntelliJ에서 커버리지 확인
위에서 한 것처럼 테스트 코드를 실행하여 자동으로 생성되는 html 보고서를 통해 커버리지를 확인해 볼 수 있습니다.
하지만 매번 html 파일을 들어가서 확인을 하는 불편함이 있는데, IntelliJ를 사용하고 계시는 경우 더 편리하게 커버리지를 확인할 수 있습니다.
IntelliJ 우측 상단을 확인해 보면 다음과 같은 아이콘이 있는 것을 확인할 수 있습니다.
해당 아이콘은 실행과 함께 커버리지를 확인해 볼 수 있는 것인데 이것을 클릭하여 실행할 경우 다음과 같이 커버리지 결과물을 확인해볼 수 있습니다.
또한 프로젝트 구조를 확인해 보면 파일 별 커버리지 비율도 요약해서 다음과 같이 보여주기도 합니다.
마지막으로 소스 파일에 들어가 보면 커버리지에 포함된 코드와 포함되지 않은 코드를 다음과 같이 표현해 줍니다.
초록색은 커버리지가 포함된 것이고, 빨간색은 커버리지에 포함되지 않은 것을 의미합니다.
이상으로 Jacoco를 이용하여 테스트 커버리지 확인하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] LocalDateTime 사용하기 (0) | 2023.09.24 |
---|---|
[SpringBoot] i18n을 활용하여 다국어 처리하기 (0) | 2023.09.18 |
[SpringBoot] SpringBatch 사용하기 (4) - Quartz로 클러스터링 처리하기 (1) | 2023.09.10 |
[SpringBoot] SpringBatch 사용하기 (3) - Quartz로 배치 만들기 (0) | 2023.09.03 |
[SpringBoot] SpringBatch 사용하기 (2) - Job Parameter 활용 및 동일 Job 반복 실행 (0) | 2023.08.26 |
댓글