코드 커버리지는 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나이다.
즉, 수행한 테스트가 테스트의 대상을 얼마나 커버했는지를 나타낸다.
코드 커버리지는 소스 코드를 기반으로 수행하는 '화이트 박스 테스트'를 통해 측정한다.
[화이트 박스 테스트]
- 소프트웨어의 내부 구조와 동작을 검사하는 테스트 방식이다.
- 개발자 관점에서의 단위 테스트 방법이다.
[블랙 박스 테스트]- 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식이다.
- 개발자가 아닌 사용자 입장에서 요구사항과 기능을 테스트하는 방법이다.
함수가 최소 한 번 이상 호출된다면 충족된다. 단, 한수 내부의 모든 코드가 실행되었는지는 판단 기중에서 제외된다.
fun sampleA(): String { ... }
fun sampleB(): String { ... }
fun sampleC(): String { ... }
fun sampleD(): String { ... }
위와 같이 4개의 함수가 있을 때, 테스트 코드가 sampleA()와 sampleB()만을 실행한다면 4개 중 2개의 함수를 실행하였으므로 함수 커버리지는 50%가 된다.
코드 한 줄이 한 번 이상 실행된다면 충족된다. 라인 커버리지라고도 한다.
가장 많이 사용되는 커버리지다.
fun isZero(number: Int): Boolean {
if (number == 0) { // 1번 라인
return true // 2번 라인
}
println("${number} is not zero") // 3번 라인
return false // 4번 라인
}
위 코드를 테스트하기 위해 number = 0을 테스트 케이스로 사용하면, 1번과 2번 라인만 실행되기에 커버리지는 50%이다.
만약 number = 1을 테스트 케이스로 사용하면, 2번 라인만 실행되지 않기에 커버리지는 75%이다.
모든 조건식의 내부 조건이 true/false의 경우를 충족하는지 측정한 값이다.
fun test(x: Int, y: Int) {
println("start") // 1번 라인
if (x > 0 && y < 0) { // 2번 라인
println("true") // 3번 라인
}
println("end") // 4번 라인
}
위 코드에서 조건식의 내부 조건이란 x > 0, y < 0를 의미하며 각각 true/false의 경우가 있으면 조건 커버리지를 만족한다.
테스트 케이스의 조건이 아래와 같을 때
내부 조건식이 true, false 되는 케이스가 전부 있기에 조건 커버리지를 만족한다.
하지만 전체 조건식이 true되어 3번 라인이 실행되는 경우는 없기에 결정 커버리지는 만족하지 못한다.
모든 조건식이 true/false의 경우를 충족하는지 측정한 값이다. 브랜치 커버리지라고도 한다.
fun test(x: Int, y: Int) {
println("start") // 1번 라인
if (x > 0 && y < 0) { // 2번 라인
println("true") // 3번 라인
}
println("end") // 4번 라인
}
위 코드의 결정 커버리지를 100% 달성하는 테스트 케이스 조합은 아래와 같다.
먼저 true 분기를 실행시키기 위해서는 x와 y가 모두 양수여야 한다. false 분기를 실행시키기 위해서는 x가 음수거나 x가 양수이면서 y가 음수여야 한다.
조건 커버리지에서 사용했던 테스트 케이스 조건에 (x = 1, y = -1)의 테스트를 추가하면 결정 커버리지도 만족하게 된다.

