Jacoco 설정하기 (build.gradle & .kts)

2023. 8. 3. 23:10·JAVA

Jacoco

  • 자바코드의 커버리지를 체크할 때 사용하는 오픈소스 라이브러리이다.
  • CI/CD와 연계해 테스트 커버리지를 충분히 채우지 못하면 배포가 되지 못하게 하는 등 구성원들에게 테스트 코드를 강제할 때 사용할 수 있다.
  • 여기서 커버리지란 Test를 실행했을 때 Code가 얼마나 빈틈없이 실행됐는지 측정한 수치이다.

 

Gradle 설정

  • Java 17 / Spring Boot 3.1.2 / Gradle 8.2.1 기준

build.gradle (groovy)

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.2'
    id 'io.spring.dependency-management' version '1.1.2'

    // 1. Jacoco 플러그인 추가
    id 'jacoco'
}

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

java {
    sourceCompatibility = '17'
}

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'

    /**
     * Test Implementation
     */
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    ...
}

/**
 * Jacoco
 */
tasks.named('test') {
    useJUnitPlatform()
    // 2. test 종료 후 jacocoTestReport 실행
    finalizedBy jacocoTestReport
}

// 3. 커버리지 결과를 html 파일로 가공
jacocoTestReport {
    dependsOn test
}

// 4. 커버리지 기준을 만족하는지 확인해 주는 task
jacocoTestCoverageVerification {
    violationRules {
        rule {
            enabled = true
        
            element = 'CLASS'

            limit {
                counter = 'BRANCH'
                value = 'COVERDRATIO'
                minimum = 0.80
            }
            
            excludes = listOf(
                    "*.Config.*",
            )
        }
    }
}

 

build.gradle.kts

plugins {
    java
    id("org.springframework.boot") version "3.1.2"
    id("io.spring.dependency-management") version "1.1.2"
    
    // 1. Jacoco 플러그인 추가
    id("jacoco")
}

group = "com.onebyte"
version = "0.0.1-SNAPSHOT"

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-web")
    compileOnly("org.projectlombok:lombok")
    annotationProcessor("org.projectlombok:lombok")
    runtimeOnly("com.mysql:mysql-connector-j")

    /**
     * Test
     */
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}


/**
 * Jacoco
 */
tasks {

    test {
        useJUnitPlatform()
        // 2. test 종료 후 jacocoTestReport 실행
        finalizedBy(jacocoTestReport)
    }

    // 3. 커버리지 결과를 html 파일로 가공
    jacocoTestReport {
        dependsOn(test)
    }

    // 4. 커버리지 기준을 만족하는지 확인해주는 task
    jacocoTestCoverageVerification {
        violationRules {
            rule {
                enabled = true

                element = "CLASS"

                limit {
                    counter = "BRANCH"
                    value = "COVEREDRATIO"
                    minimum = "0.80".toBigDecimal()
                }

                // 커버리지 체크 제외 클래스 지정
                excludes = listOf(
                    "*.Config.*",
                )
            }
        }
    }
}

 

설명

  • test task에서 finalizedBy jacocoTestReport를 이용해 테스트가 종료된 후 jacocoTestReport가 실행되도록 설정했다.
  • jacocoTestReport는 커버리지 결과는 xml, csv, html과 같이 보기 쉬운 파일로 생성해주는 task이다.
  • jacocoTestCoverageCerification는 커버리지 기준, 커버리지 대상 등에 대한 기준을 정할 수 있는 task이다. 자세한 설정에 대한 내용은 아래와 같다.
tasks {

	...

    jacocoTestCoverageVerification {
        violationRules {
            rule {
            	// 커버리지를 아래 옵션으로 키고 끌 수 있다.
                enabled = true
            
            	// 룰을 체크할 단위는 클래스 단위로 설정한 것
                element = "CLASS"

                limit {
                    counter = "BRANCH" // 브랜치 대상
                    value = "COVEREDRATIO" // 커버리지 비율
                    minimum = "0.80".toBigDecimal() // 최소 80퍼센트
                }
                
                // 커버리지 체크 제외 클래스 지정
                excludes = listOf(
                    "*.Config.*",
                )
            }
        }
    }
}

 

 

gradle test 실행

  • 위와 같이 jacoco를 설정하고 test를 실행해보자.
  • build/reports/jacoco/test/html 디렉토리에 index.html 파일이 생성되었다.

jacoco report

  • index.html을 열면 아래와 같이 커버리지 페이지를 확인할 수 있다.

  • 어떤 부분이 테스트되었고 테스트되지 않았는지 확인할 수 있다.

jacoco report

 

 

 

 

참고자료

  • 우형 블로그: https://techblog.woowahan.com/2661/
  • Jacoco 버전: https://www.eclemma.org/jacoco/
  • Gradle JacocoPluginExtension: https://docs.gradle.org/current/dsl/org.gradle.testing.jacoco.plugins.JacocoPluginExtension.html
  • build.gradle.kts: https://github.com/th-deng/jacoco-on-gradle-sample/blob/master/build.gradle.kts
'JAVA' 카테고리의 다른 글
  • Remote JVM Debug (feat. IntelliJ, k8s)
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (203)
      • Spring (23)
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4)
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (1)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    운영체제
    부스트캠프
    스프링
    부스트캠프 7기
    jsp
    알고리즘
    부스트캠프 멤버십
    자바
    Spring
    스프링부트
    GitHub
    Python
    os
    웹개발
    자바스크립트
    java
    Git
    오류해결
    MySQL
    파이썬
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
Jacoco 설정하기 (build.gradle & .kts)
상단으로

티스토리툴바