테스트 커버리지 확인하기
코드 커버리지
- 소프트웨어의 테스트 수준이 충분한지 표현할 수 있는 지표 중 하나
- 테스트를 진행했을 때 해당 코드가 실행되었는지를 표현하는 방법
- 많은 코드 커버리지 도구가 있다.
Jacoco란?
- Java 코드의 커버리지를 체크하는 라이브러리
- 작성된 코드의 테스트 커버리지(Test Coverage)를 측정하는 도구
- Runtime으로 Test Case를 실행하여 Coverage를 체크하는 방식
- 테스트 코드를 통해 테스트를 실행하고 그 결과를 html, xml, csv 등의 형식으로 Report를 제공
블랙 박스 테스트 / 화이트 박스 테스트
- 블랙 박스 테스트
- 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식
- 다양한 값을 입력하여 올바른 출력이 나오는지 테스트
- 사용자 관점의 테스트 방법
- 화이트 박스 테스트
- 소프트웨어의 내부 구조와 동작을 검사하는 테스트 방식
- 소프트웨어 내부 소스 코드를 테스트하는 방법
- 개발자 관점의 테스트 방법
Jacoco 설치 및 설정
plugins {
id 'jacoco'
}
jacoco {
// JaCoCo 버전
toolVersion = '0.8.5'
// 테스트결과 리포트를 저장할 경로 변경
// default는 "$/jacoco"
// reportsDir = file("$buildDir/customJacocoReportDir")
}
- jacocoTestReport: 바이너리 커버리지 결과를 사람이 읽기 좋은 형태의 리포트로 저장.
- html 파일로 생성해 사람이 쉽게 눈으로 확인할 수도 있고, SonarQube 등으로 연동하기 위해 xml, csv 같은 형태로도 리포트를 생성할 수 있다.
- jacocoTestCoverageVerification: 내가 원하는 커버리지 기준을 만족하는지 확인해 주는 task.
- 예를 들어, 브랜치 커버리지를 최소한 80% 이상으로 유지하고 싶다면, 이 task에 설정하면 된다.
- test task처럼 Gradle 빌드의 성공/실패로 결과를 보여준다.
jacocoTestReport {
reports {
// 원하는 리포트를 켜고 끌 수 있습니다.
html.enabled true
xml.enabled false
csv.enabled false
// 각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있습니다.
// html.destination file("$buildDir/jacocoHtml")
// xml.destination file("$buildDir/jacoco.xml")
}
}
jacocoTestCoverageVerification {
// 커버리지 기준
violationRules {
rule {
element = 'CLASS'
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.90
}
}
}
}
- 아래 코드는 플러그인에서 test task에 default로 설정된 값
test {
jacoco {
enabled = true
destinationFile = file("$buildDir/jacoco/$.exec")
includes = []
excludes = []
excludeClassLoaders = []
includeNoLocationClasses = false
sessionId = "<auto-generated value>"
dumpOnExit = true
classDumpDir = null
output = JacocoTaskExtension.Output.FILE
address = "localhost"
port = 6300
jmx = false
}
}
- 아래 설정은
test task에서는 JUnit을 사용한다고 Gradle에 알려주는 것임.
- 이 설정을 주지 않으면 아래처럼 jacocoTestReport task와 jacocoTestCoverageVerification task를 스킵한다.
- 실제로 테스트 자체가 돌지 않게 된다.
test {
useJUnitPlatform()
}
커버리지 기준 설정
jacocoTestCoverageVerification {
violationRules {
rule {
// 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 합니다.
// 위의 리포트에서 'Total'로 표시된 부분입니다.
limit {
// 'counter'를 지정하지 않으면 default는 'INSTRUCTION'
// 'value'를 지정하지 않으면 default는 'COVEREDRATIO'
minimum = 0.30
}
}
// 여러 룰을 생성할 수 있습니다.
rule {
// 룰을 간단히 켜고 끌 수 있습니다.
enabled = true
// 룰을 체크할 단위는 클래스 단위
element = 'CLASS'
// 브랜치 커버리지를 최소한 90% 만족시켜야 합니다.
limit {
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.90
}
// 라인 커버리지를 최소한 80% 만족시켜야 합니다.
limit {
counter = 'LINE'
value = 'COVEREDRATIO'
minimum = 0.80
}
// 빈 줄을 제외한 코드의 라인수를 최대 200라인으로 제한합니다.
limit {
counter = 'LINE'
value = 'TOTALCOUNT'
maximum = 200
}
}
}
}
- 커버리지 체크 기준이 되는 element는 다음 중에 하나를 선택할 수 있다.
- 위의 샘플처럼 CLASS를 선택하면 클래스 단위로 브랜치와 라인 커버리지를 체크.
- BUNDLE (default): 패키지 번들
- PACKAGE: 패키지
- CLASS: 클래스
- SOURCEFILE: 소스파일
- METHOD: 메소드
- 설정 가능한 counter
- LINE: 빈 줄을 제외한 실제 코드의 라인 수
- BRANCH: 조건문 등의 분기 수
- CLASS: 클래스 수
- METHOD: 메소드 수
- INSTRUCTION (default): Java 바이트코드 명령 수
- COMPLEXITY: 복잡도
- value는 아래 중에서 선택할 수 있다.
- TOTALCOUNT: 전체 개수
- MISSEDCOUNT: 커버되지 않은 개수
- COVEREDCOUNT: 커버된 개수
- MISSEDRATIO: 커버되지 않은 비율. 0부터 1 사이의 숫자로, 1이 100%
- COVEREDRATIO (default): 커버된 비율. 0부터 1 사이의 숫자로, 1이 100%
- 참고
https://www.youtube.com/watch?v=FCTYoce21OI&list=PLlTylS8uB2fBOi6uzvMpojFrNe7sRmlzU&index=22
'개발 > Java&Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 기초 살펴보기 (0) | 2022.11.25 |
---|---|
[Spring] 스프링 부트에 캐시 적용하기 (0) | 2022.11.24 |
[Spring] 테스트 코드 적용하기 (0) | 2022.11.21 |
[Spring] 스프링 부트에서의 예외 처리 (2) | 2022.11.17 |
[Spring] 알아두면 좋은 디자인 패턴 (1) | 2022.11.15 |