BE/Spring & Spring Boot

[Spring Boot] JaCoCo (Java Code Coverage)

baek-dev 2025. 2. 10. 18:56

Java 애플리케이션의 코드 커버리지를 측정하는 오픈 소스 도구로, 테스트 코드가 실제로 소스 코드의 어느 부분을 실행했는지 분석하는 역할을 함.

주로 JUnit 테스트와 함께 사용되며, 테스트 코드가 작성된 클래스의 몇 %를 실행했는지 측정하여 테스트의 품질을 향상시키는 데 도움을 줌.

 

1. JaCoCo의 코드 커버리지 지표

JaCoCo는 다음과 같은 커버리지 지표를 제공함:

커버리지 유형 설명
Line Coverage 실행된 코드 라인의 비율
Branch Coverage if-else, switch 등의 분기 실행 비율
Instruction Coverage 실행된 JVM 바이트코드 명령어의 비율
Method Coverage 실행된 메서드 개수와 비율
Class Coverage 실행된 클래스 개수와 비율

 

이 커버리지 지표를 활용하면 어떤 부분의 테스트가 부족한지 파악 가능함


2. JaCoCo 설정 방법 (Gradle & Maven)

2.1. Gradle 설정 (Spring Boot)

 

JaCoCo를 사용하려면 build.gradle에 아래와 같이 추가하면 됨.

plugins {
    id 'jacoco' // JaCoCo 플러그인 추가
}

jacoco {
    toolVersion = "0.8.10" // 최신 버전 사용
}

tasks.named('test') {
    finalizedBy 'jacocoTestReport' // 테스트 후 자동으로 커버리지 리포트 생성
}

tasks.named('jacocoTestReport') {
    reports {
        xml.required.set(true)
        html.required.set(true)
    }
}

 

위 설정을 추가한 후 다음 명령어를 실행하면 커버리지 리포트가 생성됨.

./gradlew test jacocoTestReport

 

JaCoCo 커버리지 결과는 기본적으로 build/reports/jacoco/test/html/index.html에 생성됨.


2.2. Maven 설정 (Spring Boot)

 

Maven 프로젝트에서는 pom.xml에 JaCoCo 플러그인을 추가하면 됨.

<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.10</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

테스트를 실행하면 자동으로 커버리지가 계산됨.

mvn test
mvn jacoco:report

 

결과는 target/site/jacoco/index.html에 HTML 리포트로 저장됨.


3. JaCoCo 코드 커버리지 리포트 해석

테스트를 실행하면 HTML 리포트가 생성되며, 다음과 같은 정보를 확인할 수 있음.

 

3.1. 커버리지 리포트 예시

  • Line Coverage (라인 커버리지)
    • 초록색 ✅: 테스트로 실행된 코드
    • 빨간색 ❌: 테스트되지 않은 코드
  • Branch Coverage (분기 커버리지)
    • if-else, switch문 등의 분기 실행 비율을 나타냄.
    • 예를 들어, if문이 두 개의 경로(True/False)를 가질 경우, 두 경로가 모두 테스트되지 않으면 분기 커버리지가 낮아짐.

4. JaCoCo에서 커버리지 기준을 설정하는 방법

기본적으로 JaCoCo는 테스트 커버리지 제한을 두지 않지만, 프로젝트에서 커버리지 목표를 설정할 수도 있음.

 

4.1. Gradle에서 커버리지 최소 기준 설정

 

JaCoCo에서 코드 커버리지의 최소 요구 기준을 설정할 수 있음.

jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = 0.80 // 80% 이상 커버리지 요구
            }
        }
    }
}

 

테스트 실행 시 커버리지가 80% 미만이면 빌드 실패하게 됨.

./gradlew check

 

4.2. Maven에서 커버리지 기준 설정

<execution>
    <id>check</id>
    <goals>
        <goal>check</goal>
    </goals>
    <configuration>
        <rules>
            <rule>
                <element>BUNDLE</element>
                <limits>
                    <limit>
                        <counter>LINE</counter>
                        <value>COVEREDRATIO</value>
                        <minimum>0.80</minimum> <!-- 80% 이상 요구 -->
                    </limit>
                </limits>
            </rule>
        </rules>
    </configuration>
</execution>

5. JaCoCo에서 제외할 코드 설정

JaCoCo는 모든 코드를 대상으로 분석하지만, 특정 코드(예: DTO, Lombok 코드, 메인 메서드 등)는 제외할 수 있음.

 

5.1. Lombok이 자동 생성한 코드 제외

 

Lombok의 @Getter, @Setter 같은 자동 생성된 코드를 제외하려면 build.gradle에 다음을 추가:

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(
            files(classDirectories.files.collect {
                fileTree(dir: it, exclude: [
                    '**/dto/**',      // DTO 클래스 제외
                    '**/config/**',   // 설정 클래스 제외
                    '**/MainApplication*' // 메인 클래스 제외
                ])
            })
        )
    }
}

 

5.2. Maven에서 특정 패키지 제외

<configuration>
    <excludes>
        <exclude>com/example/dto/**</exclude>
        <exclude>com/example/config/**</exclude>
    </excludes>
</configuration>

6. JaCoCo의 장점과 단점

6.1. 장점

 

코드 테스트 품질 향상

테스트되지 않은 코드 확인 가능

Gradle/Maven과 쉽게 연동 가능

JUnit 테스트와 통합 가능

HTML 보고서로 시각적 분석 가능

 

6.2. 단점

 

커버리지가 높다고 해서 테스트가 완벽하진 않음

private 메서드는 직접 측정되지 않음

동적 프록시(예: AOP) 기반 코드는 커버리지에서 누락될 수도 있음


7. 결론

  • JaCoCo는 Java 프로젝트의 코드 커버리지를 분석하는 필수 도구이며, JUnit과 함께 사용하면 테스트 품질을 개선할 수 있음.
  • Gradle/Maven 설정을 통해 쉽게 연동 가능하며, HTML 리포트를 통해 시각적인 분석이 가능함.
  • 테스트되지 않은 부분을 찾아내어 코드 품질을 높이는 데 도움을 줌.
  • 테스트 커버리지를 목표로 설정하면 CI/CD 파이프라인에서 자동화 가능.

 

 

 

 

출처 : ChatGPT