PHpullh
학습 라이브러리/Kotlin/코드 커버리지 (Code Coverage)

KOTLIN · 테스트

코드 커버리지 (Code Coverage)

테스트가 코드를 얼마나 실행하는지 측정합니다. 라인, 분기, 조건 커버리지의 차이를 이해합니다.

테스트중급coveragejacocobranch-coverageline-coverage

핵심 설명

테스트가 코드를 얼마나 실행하는지 측정합니다. 라인, 분기, 조건 커버리지의 차이를 이해합니다.

Kotlin code

// 테스트 대상
fun classify(score: Int): String = when {
    score < 0 || score > 100 -> throw IllegalArgumentException("점수 범위 초과")
    score >= 90 -> "A"
    score >= 80 -> "B"
    score >= 70 -> "C"
    score >= 60 -> "D"
    else -> "F"
}

// 커버리지 측정 시뮬레이션
class CoverageTracker {
    private val branches = mutableMapOf<String, Boolean>()

    fun track(branch: String, hit: Boolean) {
        branches[branch] = branches.getOrDefault(branch, false) || hit
    }

    fun report() {
        val total = branches.size
        val covered = branches.count { it.value }
        println("분기 커버리지: $covered/$total (${covered * 100 / total}%)")
        branches.filter { !it.value }.forEach {
            println("  미실행: ${it.key}")
        }
    }
}

fun main() {
    val tracker = CoverageTracker()
    val testInputs = listOf(95, 85, 75, 65, 50)
    // 누락: 범위 초과 케이스

    val allBranches = listOf("범위초과", "A등급", "B등급", "C등급", "D등급", "F등급")
    allBranches.forEach { tracker.track(it, false) }

    testInputs.forEach { score ->
        val grade = classify(score)
        tracker.track("${grade}등급", true)
        println("점수 $score → $grade")
    }

    println("
=== 커버리지 리포트 ===")
    tracker.report()
    println("
→ '범위초과' 분기 테스트가 필요합니다!")
}

학습 팁

JaCoCo를 Gradle에 추가하면 자동으로 커버리지를 측정하고 리포트를 생성합니다. jacocoTestReport 태스크를 사용하세요.

주의할 점

100% 라인 커버리지가 모든 버그를 잡는 것은 아닙니다. 분기 커버리지와 뮤테이션 테스트를 함께 활용하여 테스트 품질을 높이세요.

자주 묻는 질문

코드 커버리지 (Code Coverage)란 무엇인가요?

테스트가 코드를 얼마나 실행하는지 측정합니다. 라인, 분기, 조건 커버리지의 차이를 이해합니다.

코드 커버리지 (Code Coverage) 학습 시 주의할 점은 무엇인가요?

100% 라인 커버리지가 모든 버그를 잡는 것은 아닙니다. 분기 커버리지와 뮤테이션 테스트를 함께 활용하여 테스트 품질을 높이세요.