Test Coverage 란
Test Coverage란 작성한 테스트가 작성한 코드의 얼마만큼을 테스트 하고 있는지에 대한 지표이다.
Test Coverage 확인하기
Test Coverage를 확인하기 위해서는 Test 클래스의 실행 버튼에서 3번째 버튼 'Run [클래스명] with Coverage' 를 누르면 된다 .
이를 실행하면 MinuteValidator에 대한 테스트 커버리지가 다음과 같이 나오게 된다. 커버리지는 Class 단위, 메서드 단위, 라인 단위로 모두 확인할 수 있다.
또한 MinuteValidator 클래스 내부에 들어가 보면 Line 에 초록색 네모박스 표시가 되어서 어떤 Line이 테스트 완료되었는지를 확인할 수 있다.
Test Coverage의 한계점
Test Coverage 상에서 Coverage가 100%가 나온다고 테스트 된 class가 사용하기에 안전하다는 뜻은 아니다. 이유는 테스트가 모든 케이스를 잡아내기는 어렵기 때문이다. 예를 들어 MinuteValidator을 다음과 같이 작성했다고 하자.
class MinuteValidator {
fun isValid(minute: Int): Boolean {
return (0..69).contains(minute)
}
}
위 MiniuteValidator은 분을 확인해야 하므로 0에서 69분이 모두 유효하다는 것은 틀렸다. 69분은 59분이 되어야 한다. 하지만 우리가 기존에 작성했던 MinuteValidatorTest 테스트로 위 코드를 테스트 하면 어떻게 될까?
internal class MinuteValidatorTest {
lateinit var minuteValidator: MinuteValidator
@Before
fun setUp() {
minuteValidator = MinuteValidator()
}
@Test
fun isValidReturnsTrueIfMinuteIn0to59() {
assertEquals(minuteValidator.isValid(30), true)
}
@Test
fun isValidReturnsFalseIfMinuteNotIn0to59() {
assertEquals(minuteValidator.isValid(70), false)
}
}
실행 결과는 다음과 같다.
코드가 유효하지 않음에도 Coverage가 100%가 나오고 테스트가 모두 통과한다. 이는 Test Coverage의 함정이며, Test Coverage가 100%라고 코드가 사용하기에 안전하다는 뜻은 아니다.
이를 해결하기 위해 Test Case를 잘 만드는 것이 중요하다. 만약 위 테스트를 다음과 같이 변환시켰다면 잘못 작성된 Minute Validator가 통과되는 일은 없었을 것이다.
internal class MinuteValidatorTest {
lateinit var minuteValidator: MinuteValidator
@Before
fun setUp() {
minuteValidator = MinuteValidator()
}
@Test
fun isValidReturnsTrueIfMinuteIn0to59() {
assertEquals(minuteValidator.isValid(59), true)
}
@Test
fun isValidReturnsFalseIfMinuteNotIn0to59() {
assertEquals(minuteValidator.isValid(60), false)
}
}
정리
앞선 예제에서 볼 수 있듯이 테스트 케이스를 작성할 때는 이 테스트가 정말로 문제가 있는 코드를 잡아낼 수 있는지를 잘 생각하는 것이 중요하다. Test Coverage, Line Coverage가 100%라고 해도 테스트가 제대로 작성되지 않았다면 문제가 생길 것이다.
'Unit Testing' 카테고리의 다른 글
Unit Testing에서 Test Double이 필요한 이유는 무엇일까? (0) | 2022.12.17 |
---|---|
Kotlin에서 사용할 수 있는 JUnit assert 종류 알아보기 : assertEquals, assertTrue, assertThrows, assertNotNull (0) | 2022.12.16 |
IntelliJ, Android Studio에서 Test 결과를 시각적으로 확인하는 방법 : Gradle 사용 (0) | 2022.12.14 |
Command Line에서 Test 실행하기 : Gradle Task 활용하기 (0) | 2022.12.13 |
@Before Annotation 사용해 테스트 환경 설정하기 (0) | 2022.12.12 |