테스트 커버리지와 Jacoco

Mugeon Kim·2024년 6월 25일
0
post-thumbnail

테스트 커버리지

  • 테스트 커버리지란 전체 코드에서 얼마나 테스트 코드를 작성이 실행이 되었는지 알 수 있는 지표를 의미를 한다.
  • 일반적으로 테스트 커버리지를 통해 전반적으로 테스트가 부족한지 아니면 적정한지 알 수 있다고 많은 글에서 작성이 되어져 있지만 꼭 테스트 커버리지가 100%가 되는 것이 적절하지 않고 테스트 전략이 중요하다고 개인적으로 생각한다.

테스트 커버리지 100%?

  • 테스트 커버리지는 단위 테스트 글에 의하면 100%를 해야지 올바른 방식이라고 확정하지 않는다.
  • 테스트 커버리지는 일정 기중 이하 ( 일반적으로 60%라고 말한다. )이면 문제가 될 수 있다고 판단한다.
    • 이 부분도 물론 프로젝트에서 테스트의 전략에 따라서 중요하다고 생각한다.
  • 결국에는 글에서 말하는 내용은 ** 테스트 커버리지가 높다고 회귀 내성이 잘 지켜지고 있다고 알 수 없기 때문에 테스트 커버리지를 100% 목표로 테스트 코드를 작성해서는 안된다.**
  • 하지만 너무 낮은 테스트 커버리지는 회귀 내성과 일반적인 테스트가 수행이 안되기 때문에 개인적으로 60% 이상을 추천한다.

Jacoco

  • jacoco는 jvm계열 언어에서 가장 많이 활용하는 커버리지의 도구이다.

https://docs.gradle.org/current/userguide/jacoco_plugin.html#sec:configuring_the_jacoco_plugin

https://techblog.woowahan.com/2661/

gradle

plugins {
	-- 추가
    id 'jacoco'
}

-- 추가
jacoco {
    toolVersion = "0.8.8"
    reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir')
}

-- 추가
test {
    finalizedBy jacocoTestReport
}

-- 추가
jacocoTestReport {
    reports {
        xml.required = false
        csv.required = false
        html.outputLocation = layout.buildDirectory.dir('jacocoHTML')
    }
    dependsOn test // jacocoTestReport 에 test라는 종속성을 추가
    finalizedBy 'jacocoTestCoverageVerification'

    afterEvaluate {
        classDirectories.setFrom(
                files(classDirectories.files.collect {
                    fileTree(dir: it, excludes: [
                            "**/*Config*",
                            "**/*exception*",
                            "**/*model*",
                            "**/*Util*",
                            "**/com/xx/xx/config/**",
                            "**/com/xx/xx.class",
                            "**/com/xx/xx.class",
                            "**/com/xx/xx.class"
                    ])
                })
        )
    }
}



jacocoTestCoverageVerification {
    violationRules {

        rule {
            enabled = true
            //코드 버커리지 체크 기준
            element = 'CLASS'

            limit {
                counter = 'METHOD'
                value = 'COVEREDRATIO'
//                minimum = 0.5
            }
        }

    }
}


java {
    sourceCompatibility = '17'
}

ext['tomcat.version'] = '10.1.18'

repositories {
    mavenCentral()
}

dependencies {
	// 생략
}

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

springBoot {
    buildInfo()
}

JaCoCo 테스트 리포트 (jacocoTestReport)

JaCoCo 테스트 리포트는 테스트 결과를 리포트 형식으로 생성합니다. 사용자는 리포트 형식과 디렉토리를 지정할 수 있습니다.

JaCoCo 테스트 커버리지 검증 (jacocoTestCoverageVerification)

JaCoCo 테스트 리포트 결과를 바탕으로 커버리지가 만족되는지 검증합니다. 이 과정에서 다음과 같은 옵션을 설정할 수 있습니다:

검증 요소 (element)

커버리지 체크 기준이 되는 요소는 다음 중 하나를 선택할 수 있습니다.

BUNDLE (기본값): 패키지 번들
PACKAGE: 패키지
CLASS: 클래스 (클래스 단위로 브랜치와 라인 커버리지 체크)
SOURCEFILE: 소스파일
METHOD: 메소드
카운터 (counter)

설정 가능한 카운터는 다음과 같습니다

LINE: 빈 줄을 제외한 실제 코드의 라인 수
BRANCH: 조건문 등의 분기 수
CLASS: 클래스 수
METHOD: 메소드 수
INSTRUCTION (기본값): Java 바이트코드 명령 수
COMPLEXITY: 복잡도 (자세한 복잡도 계산은 JaCoCo 문서 참고)
값 (value)

TOTALCOUNT: 전체 개수
MISSEDCOUNT: 커버되지 않은 개수
COVEREDCOUNT: 커버된 개수
MISSEDRATIO: 커버되지 않은 비율 (0부터 1 사이의 숫자로, 1이 100%)
COVEREDRATIO (기본값): 커버된 비율 (0부터 1 사이의 숫자로, 1이 100%)
  • verification에서 jacocoTestReport를 통해서 build하고 build > report에서 index.html을 확인할 수 있습니다.

profile
빠르게 실패하고 자세하게 학습하기

0개의 댓글