Skip to main content

Command Palette

Search for a command to run...

JaCoCo

Updated
3 min read
JaCoCo
  1. JaCoCo


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

    코드 커버리지란 작성한 test code가 본 코드를 얼마나 커버하고 있냐를 측정하는 지표이다.

    테스트 코드를 돌린 후 html, csv, xml 리포트로 생성가능하다. 또한 설정한 커버리지 만족 기준을 설정하여 통과하여야만 하도록 설정할 수 있다.

    CI 중 Test를 실행했을 때 커버리지를 만족하지 못할 경우 build를 못하게 하기 위함

  2. JaCoCo 적용


    JaCoCo 플러그인 적용

    build.gradle 파일에서 작성

     plugins {
         id 'jacoco'
     }
    
  3. JacocoTestReport 설정

     jacocoTestReport{
         reports {
             html.required = true
             xml.required = false
             csv.required = false
             html.outputLocation = layout.buildDirectory.dir("jacocoHtml")
         }
         finalizedBy jacocoTestCoverageVerification
     }
    

    required: 생성 여부

    outputLocation: 생성 위치

    finalizedBy: jacocoTestReport 실행 후 다음 실행 task 지정

    jacocoTestCoverageVerification 설정

    ```java jacocoTestCoverageVerification { violationRules { rule{ enabled = true element = 'CLASS'

limit { counter = 'BRANCH' value = "COVEREDRATIO" minimum = 0.8 } } } }


    element가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다.

    counter가 없으면 INSTRUCTION이 기본 값

    value가 없으면 COVEREDRATIO)가 기본 값

    여러 rule을 생성할 수 있다.

    enabled를 통해 껐다 켰다 할 수 있음

    element는 룰을 체크할 단위

    limit은 제한 범위로 커버리지 만족도를 설정할 수 있음

    **설정 옵션**

    element

    * BUNDLE (defalut): 패키지 번들

    * PACKAGE: 패키지

    * CLASS: 클래스

    * SOURCEFILE: 소스파일

    * METHOD: 메소드


    counter

    * LINE: 빈 줄을 제외한 실제 코드의 라인 수

    * BRANCH: 조건문 등의 분기 수

    * CLASS: 클래스 수

    * METHOD: 메소드 수

    * INSTRUCTION (default): Java 바이트코드 명령 수

    * COMPLEXITY: 복잡도


    value

    * TOTALCOUNT: 전체 개수

    * MISSEDCOUNT: 커버되지 않은 개수

    * COVEREDCOUNT: 커버된 개수

    * MISSEDRATIO: 커버되지 않은 비율. 0부터 1 사이의 숫자

    * COVEREDRATIO (default): 커버된 비율. 0부터 1 사이의 숫자


    **build.gradle 전체 코드**

    ```java
    plugins {
        id 'java'
        id 'org.springframework.boot' version '2.7.14'
        id 'io.spring.dependency-management' version '1.0.15.RELEASE'
        id 'jacoco'
    }

    group = 'com.example'
    version = '0.0.1-SNAPSHOT'

    java {
        sourceCompatibility = '11'
    }

    jacoco {
        toolVersion = '0.8.9'
    }

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        compileOnly 'org.projectlombok:lombok'
        runtimeOnly 'com.mysql:mysql-connector-j'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testImplementation group: 'com.h2database', name: 'h2', version: '2.1.214'

        // map struct 의존성
        implementation 'org.mapstruct:mapstruct:1.4.2.Final'
        annotationProcessor "org.mapstruct:mapstruct-processor:1.4.2.Final"
        annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
    }

    tasks.named('test') {
        finalizedBy jacocoTestReport
        useJUnitPlatform()
    }

    jacocoTestReport{
        reports {
            html.required = true
            xml.required = false
            csv.required = false
            html.outputLocation = layout.buildDirectory.dir("jacocoHtml")
        }
        finalizedBy jacocoTestCoverageVerification
    }

    jacocoTestCoverageVerification {
        violationRules {
            rule{
                element = 'CLASS'

                limit {
                    counter = 'BRANCH'
                    value = "COVEREDRATIO"
                    minimum = 0.8
                }
            }
        }
    }

실행

test → jacocoTestReport → jacocoTestCoverageVerification 순으로 실행해야 함.

build.gradle 파일이 있는 곳에서 ./gradlew test 명령어로 테스트 task 실행

결과

초록색은 커버가 된 비율 빨간색은 커버 되지 않은 비율

초록색은 커버된 라인 빨간색은 커버되지 않은 라인

노란색도 있는데 노란색은 일부만 커버된 라인 ex) if문의 true값만 테스트 된 경우

코드 커버리지 조건을 만족하지 못해 build 오류 발생.