본문 바로가기

Java

[Spring] 프로젝트 Jacoco 적용하기

테스트 코드의 중요성은 많은 개발자가 알고 있다.

오늘은 이전에 만든 프로젝트에 jacoco 를 적용시켜서 내가 작성한 테스트 코드가 커버리지가 어느 정도인지 파악해볼려고 한다.

JaCoCo

JaCoCo is a free code coverage library for Java, which has been created by the EclEmma team based on the lessons learned from using and integration existing libraries for many years - JaCoCo

JaCoCo 자바 코드 커버리지를 체크하는 데에 사용되는 오픈소스 라이브러리이다.

JaCoCo의 버전은 Maven Central Repository를 통해 확인할 수 있습니다. 작성일(20.10.05) 기준, 최신 버전은 0.8.6입니다.

JaCoCo의 특징

JaCoCo가 가지는 특징으로는

  • Line, Branch Coverage를 제공한다.
  • 코드 커버리지 결과를 보기 좋도록 파일 형태로 저장할 수 있다.
    • html, xml, csv 등으로 Report를 생성할 수 있다.
  • 설정한 커버리지 기준을 만족하는지 확인할 수 있다.

등이 있다.

이러한 특징들은 코드 커버리지를 쉽게 확인하고 관리할 수 있도록 도와준다.

 

JaCoCo 적용

개발 환경

  • Java 11
  • Spring Boot 2.7.5
  • Gradle 7.5.1

 

Jacoco 플러그인 설치

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.5'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'jacoco' 플러그인 추가
}

tasks.named('test') {
    jacoco {
        destinationFile = file("$buildDir/jacoco/jacoco.exec")
    }

    useJUnitPlatform()

    finalizedBy 'jacocoTestReport'
}

jacoco {
    // JaCoCo 버전
    toolVersion = '0.8.8'

//  테스트결과 리포트를 저장할 경로 변경
//  default는 "$/jacoco"
//  reportsDir = file("$buildDir/customJacocoReportDir")
}

 

Jacoco 플러그인 설정

JacocoTestReport

바이너리 커버리지 결과를 사람이 읽기 좋은 형태의 리포트로 저장해주는 Task이다.

jacocoTestReport {
    reports {
// 원하는 리포트를 켜고 끌 수 있다.
        xml.enabled(true)
        html.enabled(true)
        xml.destination(new File("build/reports/jacoco.xml"))
    }

    finalizedBy 'jacocoTestCoverageVerification'
}

JacocoTestCoverageVerification

원하는 커버리지 기준을 만족하는지 확인해 주는 Task이다.

현재 지정은 0.3으로 이보다 coverage가 낮을 경우 빌드가 실패한다.

jacocoTestCoverageVerification {
    violationRules {
        rule {
// 'element'가 없으면 프로젝트의 전체 파일을 합친 값을 기준으로 한다.
            limit {
// 'counter'를 지정하지 않으면 default는 'INSTRUCTION'
// 'value'를 지정하지 않으면 default는 'COVEREDRATIO'
                minimum = 0.30
            }
        }

        rule {
            // 룰을 간단히 켜고 끌 수 있다.
            enabled = true

            // 룰을 체크할 단위는 클래스 단위
            element = 'CLASS'

        }
    }
}

finalizedBy란?

task 순서를 설정하기 위해 사용한다.

만약 task가 jacocoTestCoverageVerificationJacocoTestReport 보다 먼저 실행되면 리포트 생성 이전에 coverage를 체크하게 된다.

이런 불상사를 예방하기 위해 각 task 사이의 의존성 설정하기 위해서 사용한다

 

테스트 실행

빌드 해보면서 jacoco 적용을 확인해 본다

build를 해본 결과 test task에서 빌드가 실패 했음을 알 수 있다.

바로 레포트를 확인하자

레포트는 build\reports\jacoco\test\html\index.html에서 확인 할 수 있다.

 

레포트 결과

비즈니스 로직 같은 곳에서는 어느정도 coverage가 나왔지만 utils,configuration과 같은 설정 파일을 보관한 곳까지 같이

coverage를 분석해서 빌드에 실패했다.

이러한 내용을 방지하기 위해선 jacocoTestCoverageVerification에서 excludes 설정을 하면 해결 할 수 있다.

 

 

 

이런식으로 클래스, 메서드 별로 어느 부분이 TestCode가 부족한지 체크할 수 있어 test 코드 작성 시 도움이 많이 될 것 같다.

 

정리 

코드 커버리지 체크를 해봤다

 

나름 테스트코드를 작성했다고 생각했는데 coverage가 많이 부족해서 조금 놀랐다..

다른 기술블로그를 찾아본 결과 coverage는 보통 80%이상 심지어 100% 까지 되는 브랜치도 있다고 하는데

아직 테스트 코드 작성이 많이 부족함을 느낄 수 있었다.

다음 프로젝트 부터는 테스트 코드 작성을 조금 더 빡쎄게 해봐야 겠다!