이번 포스트는 테스트와 관련된 회고입니다!
저는 기능 구현도 중요하지만, 그에 맞는 적절하고 꼼꼼한 테스트 코드를 작성하는 것도 굉장히 중요하다고 생각하는데요
그래서 평소에 코딩할 때 테스트에 관한 고민을 자주 하는 편인것 같습니다.
브릿지 프로젝트를 진행하면서 채팅을 포함해 다양한 기능을 구현하게 되었고, 테스트 코드도 빠짐없이 작성했습니다.
하지만 후반부로 갈수록 제가 작성한 테스트들이 기능의 어느정도까지 커버하고 있는지, 커버리지가 궁금했습니다.
기능을 검증하기 위한 수단이 테스트이기 때문에, 벗어난 테스트를 작성하는 것은 의미가 약해진다고 느꼈습니다.
결론은 태스트 커비리지 확인을 위해 JaCoCo 라이브러리를 도입하게 되었습니다.
회고 시작하겠습니다!
JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리입니다.
테스트 코드들을 돌리고 커버리지 결과를 직접 눈으로 확인할 수 있도록 html, xml, csv 같은 리포트로 생성합니다.
또한 직접 커버리지 기준을 설정한 후, 결과가 만족하는지 여부도 파악할 수 있습니다.
사용 방법에 대해 간단하게 설명하겠습니다.
관련 빌드 설정은 아래 적용 단계에서 설명하도록 하겠습니다.
JaCoCo의 Gradle 플러그인에는 두 종류의 task가 존재합니다.
jacocoTestReport
jacocoTestCoverageVerification
하나씩 살펴보도록 하겠습니다.
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'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 합니다.
// 위의 리포트에서 'Total'로 표시된 부분입니다.
element = 'CLASS'
limit {
// 'counter'를 지정하지 않으면 default는 'INSTRUCTION'
// 'value'를 지정하지 않으면 default는 'COVEREDRATIO'
counter = 'BRANCH'
value = 'COVEREDRATIO'
minimum = 0.90
}
}
// 여러 룰을 생성할 수 있습니다.
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
는 아래 중 하나를 선택할 수 있습니다.
설정 가능한 counter
는 아래와 같습니다.
마지막으로 설정 가능한 value
는 아래와 같습니다
한 번 실제로 적용해볼까요?
위처럼 빌드와 룰을 설정해줍니다.
Build를 해보면 옆 Gradle
에 아래와 같은 task가 생기는 걸 확인할 수 있습니다.
주의할 점은 task 실행 순서를 지켜줘야합니다.
test → jacocoTestReport → jacocoTestCoverageVerification 순서로 진행해야 정상적으로 테스트 커버리지 결과를 확인할 수 있습니다.
한 번 실행해보겠습니다.
에러인거 같지만 예상한 결과가 나왔습니다.
커버리지 기준을 0.9로 설정했기 때문에 마지막 빌드 결과가 Fail로 떨어졌습니다.
상세한 커버리지 결과를 살펴보겠습니다.
결과는 아래와 같습니다.
커버리지에 포함되지 않는 DTO, Q*.class 같은 파일이 포함되어 있기 때문에 주의 깊게 볼 부분은
domain, service, security, controller입니다.
모두 최소 커버리지 62% 이상인것을 확인할 수 있습니다.
안쪽으로 쭉 들어가보면 구현한 메소드 별로 테스트 커버리지를 확인할 수 있습니다.
코드 파일에서는 커버가 된 라인은 초록색, 놓친 부분은 빨간색으로 표시해줍니다.
노란색은 모든 조건이 아닌 일부만 테스트된 라인입니다.
이처럼 JaCoCo 라이브러리를 통해 테스트 커버리지를 상세하게 확인할 수 있습니다.
본인의 커버리지 기준을 세우고 점점 높여가며 진행해보는 것도 좋은 방법일 것 같습니다.
읽어주셔서 감사합니다!
References