Skip to content

Jacoco 세팅

Yujin Kim edited this page Jan 16, 2023 · 1 revision

Jacoco란?

Java 코드의 커버리지를 체크하는 라이브러리

  • 코드 커버리지 : 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나

테스트코드를 돌리고 그 커버리지 결과를 눈으로 보기 좋도록 html, xml, csv 같은 리포트로 생성

코드 커버리지 측정 기준

1. 구문 (Statement)

= 라인 커버리지

코드 한 줄이 한 번 이상 실행된다면 충족

가장 많이 사용되는 기준

2. 조건 (Condition)

모든 조건식의 내부 조건(조건식 내부의 각각의 조건)이 true나 false를 가지게 되면 충족

조건 커버리지를 기준으로 테스트를 진행할 경우, 구문 커버리지와 결정 커버리지를 만족하지 못하는 경우 존재

3. 결정 (Decision)

= 브랜치 커버리지

모든 조건식이 true나 false를 가지게 되면 충족

참고 :
https://velog.io/@lxxjn0/코드-분석-도구-적용기-1편-코드-커버리지Code-Coverage가-뭔가요 https://xlffm3.github.io/devops/jacoco-sonarcube/

코드 커버리지가 중요한 이유

테스트코드로 커버하지 못하는 부분이 발생할 수 있음

테스트에서 놓칠 수 있는 부분들을 코드 커버리지를 통해 확인 가능

많은 서비스 기업들에서도 코드 커버리지를 최대한 유지 및 지속 상승시키며 개발 하려고 하고 있고, SonarQube와 같은 정적 코드 분석 도구를 함께 활용하여 코드 커버리지가 기존보다 떨어지는 경우 커밋하지 못하도록 제한하기도 함

⇒ 코드 커버리지는 코드의 안정성을 어느 정도 보장해 줄 수 있는 지표가 된다!

Gradle Jacoco 라이브러리 적용

공식문서 : https://docs.gradle.org/current/userguide/jacoco_plugin.html

1. Jacoco 플러그인 추가

plugins {
    id 'jacoco'
}

jacoco {
    toolVersion = '0.8.8'
    reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir') // 디렉토리 설정
}

Jacoco의 가장 최신 버전은 0.8.8 (22.12.26 기준)

기본적으로 HTML 리포트는 $buildDir/reports/jacoco 디렉토리에 생성됨

2. Jacoco task 설정

Jacoco 플러그인은 jacocoTestReport, jacocoTestCoverageVerification 등의 task를 제공함

jacoco의 리포트를 받기 위해서는 task의 순서가 중요! test → jacocoTestReport → jacocoTestCoverageVerification 순서대로 task가 실행되도록 finalizedBy를 이용해서 순서를 지정해줘야 함

test {
        finalizedBy 'jacocoTestReport' // Test 이후 커버리지가 동작하도록 finalizedBy 추가
}

jacocoTestReport {
	dependsOn test
        reports {
            html.enabled true
            csv.enabled true
            xml.enabled false
        }
        finalizedBy 'jacocoTestCoverageVerification' // 커버리지 작동 이후 검증하도록 설정
}
  • jacocoTestReport
    • 코드 커버리지 결과를 원하는 형태의 리포트로 생성해주는 task

    • 코드 커버리지 결과를 어떻게 저장할지 설정, 특정 파일을 제외해 줄 수도 있음

    • html 파일로 생성해 가독성 좋게 눈으로 확인할 수도 있고, SonarQube 등으로 연동하기 위해 xml, csv 형태로도 리포트 생성 가능

    • finalizedBy ‘jacocoTestReport’

      jacocoTestReport 수행 전에 test를 수행하도록 순서 지정, 만약 커버리지를 달성하지 못하면 gradle 빌드가 멈추게 되고 리포트 생성이 안되기 때문에 이전에 생성된 리포트를 보게 됨. 그래서 리포트 생성 후 커버리지 측정을 하도록 설정함.

jacocoTestCoverageVerification {
    violationRules {
        rule {
            element = 'CLASS' //룰을 체크할 단위는 class 단위
            enabled = true

	    // 라인 커버리지를 최소 80% 만족시켜야 한다
            limit {
                counter = 'LINE'
                value = 'COVEREDRATIO'
                minimum = 0.80
            }

	    // 브랜치 커버리지를 최소 80% 만족시켜야 한다
	    limit {
                counter = 'BRANCH'
                value = 'COVEREDRATIO'
                minimum = 0.80
            }
        }
    }
}
  • jacocoTestCoverageVerification
    • 내가 원하는 커버리지 기준을 만족하는지 지원해주는 task

    • 어떤 커버리지를 최소 몇 % 이상으로 유지하겠다 등의 조건을 설정할 수 있음

    • 테스트 할 필요가 없는 파일들은 제외할 수 있음

    • counter : 커버리지 측정의 최소 단위, 측정은 java byte code가 실행된 것을 기준으로 측정 (링크 참조)

      • BRANCH : 조건문 등의 분기 수 (if, switch 구문에 대한 커버리지 측정)
      • CLASS : 클래스 수, 내부 메서드가 한 번이라도 실행된다면 실행된 것으로 간주
      • COMPLEXITY : 복잡도
      • INSTRUCTION : Java 바이트 코드 명령 수 (default)
      • METHOD : 메서드 수, 메서드가 한 번이라도 실행된다면 실행된 것으로 간주
      • LINE : 빈 줄 제외한 실제 코드의 라인 수, 라인이 한 번이라도 실행되면 실행된 것으로 간주
    • value : 측정한 커버리지를 어떠한 방식으로 보여줄 것인지

      • COVEREDCOUNT : 커버된 개수
      • COVEREDRATIO : 커버된 비율, 0부터 1 사이의 숫자
      • MISSEDCOUNT : 커버되지 않는 개수
      • MISSEDRATIO : 커버되지 않는 비율, 0부터 1 사이의 숫자
      • TOTALCOUNT : 전체 개수
    • minimum : counter 값을 value에 맞게 표현했을 때 최솟값, jacocoTestCoverageVerification의 성공 여부 결정

    • excludes : 커버리지 측정 시 제외할 클래스 지정, 패키지 레벨의 경로로 지정하여야 하고 경로에는 와일드 카드로 * 와 ? 사용 가능

참고 :
https://velog.io/@sa1341/코드-커버리지-측정을-위한-Jacoco-라이브러리-적용
https://xlffm3.github.io/devops/jacoco-sonarcube/
https://jiwondev.tistory.com/159

Jacoco 실행 결과 예시

실행 방법 01

인텔리제이의 우측 탭에서 Gradle 클릭 → Tasks 하위 verification 하위 test 더블 클릭

실행 방법 02

minimum을 만족하지 못해 빌드 실패!

터미널에 ./gradlew test 입력

—console verbose를 추가하면 어떤 클래스에 문제가 있는지도 함께 나옴