IntelliJ, Android Studio에서 Test Coverage 확인과 Test Coverage의 한계점

2022. 12. 15. 22:15·Unit Testing
반응형

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


'Unit Testing' 카테고리의 다른 글
  • Unit Testing에서 Test Double이 필요한 이유는 무엇일까?
  • Kotlin에서 사용할 수 있는 JUnit assert 종류 알아보기 : assertEquals, assertTrue, assertThrows, assertNotNull
  • IntelliJ, Android Studio에서 Test 결과를 시각적으로 확인하는 방법 : Gradle 사용
  • Command Line에서 Test 실행하기 : Gradle Task 활용하기
심플코드
심플코드
프로그래밍을 어렵지 않게 풀어서 설명하는 기술 블로그
    반응형
  • 심플코드
    심플코드
    심플코드
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • 안드로이드를 위한 Coroutines (2)
      • Unit Testing (19)
      • GitHub Actions (0)
      • 공식 문서 번역 (35)
        • Coroutines 공식 문서 (35)
      • 알고리즘 (7)
        • Kotlin 자료구조 (0)
        • 알고리즘 (7)
        • Kotlin으로 구현하는 자료구조 (0)
      • 코딩 테스트 (0)
      • Deep Learning (0)
      • Machine Learning Math (17)
        • Linear Algebra (17)
      • ML (0)
      • Docker (15)
      • Kubernetes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 코틀린 코루틴의 정석 책 출간 소식
  • 인기 글

  • 태그

    unit test
    unit testing
    코루틴 채널
    컨테이너
    코루틴
    Kotlin
    Coroutines Channel
    도커
    Docker
    junit
    coroutine
    Machine Learning
    Coroutines
    numpy
    TensorFlow
    Coroutines Flow
    pytorch
    Coroutines Context
    mockito
    코루틴 Flow
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
심플코드
IntelliJ, Android Studio에서 Test Coverage 확인과 Test Coverage의 한계점
상단으로

티스토리툴바