본문 바로가기
Android/Testing

[Android] 테스트 코드 (1) - 왜 작성해야 할까?

by 태크민 2024. 2. 9.

안드로이드에서 테스트 코드 "왜" 작성해야 할까?

  • 코드를 작성하여 기능을 구현하고, 그 기능이 제대로 작동하는지 에뮬레이터 혹은 디바이스에서 직접 결과를 정성스럽게 확인 -> 에러가 발생하면 로그를 찍어 파악 -> 다시 수정하고 테스트 반복.
  • 위와 같은 방법으로 기능의 결함을 체크해도 문제없지 않을까? 하지만 이러한 작업은 규모가 작을 경우 문제 되지 않을 수 있지만, 앱의 규모가 커진다면 빌드하는 시간 + 테스트를 UI로 직접 입력하는 시간 등으로 시간이 점점 길어질 것입니다. 즉 테스트하기 위해 전체 앱을 매번 빌드하는 것은 비효율적인 작업이 되어버립니다.
  • 그래서 테스트 코드는 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증신뢰성 높은 코드의 생산성을 높이기 위해 작성한다고 생각이 듭니다. 또한, 휴먼 리소스 낭비를 방지할 수 있습니다.
  • 결론은 인간은 끊임없이 실수를 반복하기 때문에 테스트 코드가 이를 방지하는데 도움을 줄 수 있습니다.

 

테스트 코드 작성의 이점

  • 잘못된 부분을 빠르게 확인할 수 있게 해준다 -> 안전성, 신뢰성 높아짐.
  • 디버깅 시간을 단축 -> 개발 시간 줄여줌
  • 모듈이 의도대로 동작하고 있음을 확인 -> 리펙터링시 부담 줄여줌.
  • 좋은 구조로 개발하게끔 도와줌 -> 테스트 코드를 작성하다 보면, 테스트 가능한 구조가 되도록 코드의 관심사를 분리하게 됩니다.

 

Android Test

안드로이드는 기본적으로 JUnit을 기반으로, JVM에서 계측 테스트(Instrumentation Test), 로컬 단위 테스트(Unit Test)를 할 수 있습니다.

 

1. Unit Test

  • module-name/src/test/java 하위에 테스트 코드 작성
  • 빠르다
  • JVM에서 실행되는 테스트
  • 안드로이드 프레임워크와 종속성이 없거나 모의 객체를 생성할 수 있는 경우 이 테스트 사용
  • 검증 범위: Repository, ViewModel 혹은 Presenter, Domain레이어, Util 클래스 등
  • 검증 도구: JUnit, Mockito, PowerMock, Truth, Robolectric

 

2. Instrumentation Test

  • module-name/src/androidTest/java/ 하위에 테스트 코드 작성
  • 안드로이드 프레임워크에 종속성이 있는 테스트
  • 실제 안드로이드 기기나 에뮬레이터에서 실행되는 테스트
  • 검증 범위: 화면의 UI 출력(클릭, 텍스트 입력 등등), Flow/Navigation
  • 검증 도구: Espresso, Jetpack Compose, UIAnimator

 

"무엇"을 테스트해야 할까?

테스트 코드 작성 범위

  • 수정, 변경되는 모든 기능 -> 코드의 변경으로 인해 영향받는 코드에 대한 테스트 코드 필수.
    새로운 기능, 새로운파일 추가, 기존파일에 일부 동작이 추가된 경우 등
  • 로직에 대한 검증은 필수 -> 사용자의 요청에 따라 올바른 로직의 수행 결과가 View에 올바르게 반영되는가 검증.
    프로세스 간, 모듈 간, 클래스 간의 통용되는 주요 인터페이스에 대한 테스트, MVP 패턴을 적용한다면 Presenter의 로직, MVVM을 적용한다면 ViewModel의 로직 테스트 등.
  • View에 대한 테스트, 즉 UI Test는 필수적이지는 않다. -> 안드로이드 프레임워크나 UI 관련 테스트 코드는 작성 및 실행에 있어 어려움이 존재.
  • 뷰와 로직이 섞여 있는 경우 -> 테스트 코드를 작성하려면 최대한 관심사를 분리해야 합니다. 모듈 간 결합도가 낮아지도록 하는 DI, 디자인 패턴, 클린 아키텍처 등을 적용해서 테스트가 쉽게 이루어질 수 있도록 코드를 작성할 필요가 있습니다.
  • 그럼에도 어쩔 수 없이 섞여 있는 경우 -> View에 어쩔 수 없이 로직이 포함돼 있는 경우 instrumented Test를 작성하거나 View로부터 로직을 분리하는 리팩터링 후 분리된 로직에 대한 테스트 코드 작성 방법이 추천.

 

테스트 작성 법칙

  • Given - 특정 상황이 주어지고,
    ex) 잘못된 이메일을 입력한다.
  • When - (테스트하려는) 특정 액션이 발생했을 때.
    ex) 로그인 버튼을 클릭한다.
  • Then - 변화된 상태나 수행되는 행동을 검증
    ex) 이메일 검증 실패 메시지를 보여준다.
  • 아래 테스트 코드는 위의 법칙을 이용한 예제입니다.
@Test
fun 이메일로그인_실패케이스_잘못된이메일형식입력() {
    //Given
    잘못 된 이메일을 입력.
    
    //When
    이메일 로그인 버튼 클릭.
    
    //Then
    유효성 검증 실패 & 이메일 검증 오류 메시지 보여줌.
}

@Test
fun test_onClickEmailLogin_FailLogin_EnterIncorrectEmail() {
    `when`(view.getInputEmail()).thenReturn("abc.def@day")
    viewModel.onClickEmailLogin()
    verify(view).showMessageForIncorrectEmail()
}

 

 

 

출처

Android) 테스트 코드 왜 작성 해야 할까? 예제로 알아보자 (tistory.com)