Android 자동 테스트 작성

김동경·2024년 1월 19일
0

Android_Jetpack_Compose

목록 보기
3/7
post-custom-banner

자동테스트


처음 앱을 만들고 만든 기능이 잘 동작하는지 테스트하는 것은 필수이다.

캡스톤 작품으로 소모임 앱을 만들고 기능별로 정상적으로 작동하는지 수동으로 시간을 갈아넣으며 테스트 했던 기억이 있다...

앱을 수동으로 테스트하는 것은 많은 시간을 소비하지만 Android 자동 테스트는 앱이 적절하게 작동하는지 확인할 수 있는 편리한 방법을 제공한다


자동 테스트가 중요한 이유

  • 새 코드(기능)를 추가할 때 기존 기능을 테스트해야 하는데, 기존 테스트가 있는 경우에만 가능하다
  • 다양한 버전의 Android를 실행하는 여러 유형의 기기를 고려해야함
  • 수동 테스트보다 정확하고 팀의 생산성을 최적화 할 수 있다


자동테스트 유형

로컬테스트

소수의 코드를 직접 테스트하여 제대로 작동하는지 확인하는 유형이다. 로컬 테스트를 사용하면 함수, 클래스, 속성을 테스트할 수 있다. 로컬 테스트는 워크스테이션에서 실행되기 때문에 에뮬레이터 없이 개발환경에서 진행할 수 있다.

계측테스트

Android 개발의 경우 계측 테스트는 UI 테스트이다. Android API와 플랫폼 API 및 서비스에 종속된 앱 일부를 테스트할 수 있습니다.
로컬 테스트와 달리 UI 테스트는 앱의 일부를 실행하고 사용자 상호작용을 시뮬레이션하여 앱이 적절하게 반응했는지 확인한다. 실제 기기 및 애뮬레이터에서 실행된다.


로컬 테스트 작성

//팁 퍼센트에 따라 사용자가 팁을 얼마나 내야하는지 계산하는 함수
//테스트를 위해 @VisibleForTesting (메서드가 공개되지만 테스트 목적으로 공개된다고 사용자에게 표시)
@VisibleForTesting
internal fun calculateTip(amount: Double, tipPercent: Double = 15.0, roundUp: Boolean): String {
  var tip = tipPercent / 100 * amount
  if (roundUp) {
      tip = kotlin.math.ceil(tip)
  }
  return NumberFormat.getCurrencyInstance().format(tip)
}

로컬 테스트를 위해 테스트 디렉토리로 이동한다.

test디렉토리로 이동했고 main디렉토리와 패키지 구조가 같은 것을 확인할 수 있다.
테스트할 파일을 생성한 뒤 테스트 코드를 작성한다.

class TIpCalculatorTests {

  @Test  //컴파일러에게 메서드가 테스트 메서드임을 알린다
  fun calculateTip_20PercentNoRoundup(){
      val amount = 10.00
      val tipPercent = 20.00
      val expectedTip = NumberFormat.getCurrencyInstance().format(2) //우리가 예상한 수 있는 값
      val actualTip = calculateTip(amount = amount, tipPercent = tipPercent, false) //메인 함수에 있는 기능
      assertEquals(expectedTip, actualTip)
  }
}
  • 우리는 여기서 낸 금액이 20이고 tipPercent가 20%라면 2원의 팁을 낸다는 것을 예상할 수
    있다.
  • 그러므로 예상할 수 있는 값을 변수에 저장하고 실제 동작을 하는 함수에 인자로 넣어 우리가 예상한 값과, 함수의 결과값이 같은지 비교한다.
  • assertEquals 함수는 예상 값, 출력 값을 인자로 넣어 비교한다.


계측 테스트 작성


계측 디렉토리는 androidTest폴더에서 작성할 수 있고 마찬가지로 main디렉토리와 패키지 구조가 같은 것을 확인할 수 있다.

class TipUITest {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Test  //테스트를 위해 테스트 주석
    fun calculate_20_percent_tip() {
        composeTestRule.setContent {
            Android_ComposeCamp_CodelabTheme {
                Surface (modifier = Modifier.fillMaxSize()){
                    TipTimeLayout() //함수 본문 기능 실행  실제 앱에서도 이렇게 진행됨
                }
            }
        }
        
        composeTestRule.onNodeWithText("Bill Amount") //Bill Amount 값을 가진 텍스트로 이동해서 10의 값을 넣는다
            .performTextInput("10")
        composeTestRule.onNodeWithText("Tip Percentage")//Tip Percentage텍스트를 가진 텍스트로 이동해서 
            .performTextInput("20") //20의 값을 넣는다
        val expectedTip = NumberFormat.getCurrencyInstance().format(2) //우리가 예상한 값
        composeTestRule.onNodeWithText("Tip Amount: $expectedTip").assertExists(
            "No node with this text was found."
  	//Tip Amount에 결과과 나올 것인데 그 결과 텍스트가 우리가 예상한 expectedTip인지
        )
    }
}

컴파일러는 androidTest폴더 의 @Test가 달린 메서드는 계측 테스트임을 나타내고 test 폴더 의 @Test가 달린 메서드는 로켈 테스트임을 인식한다.

UI 구성요소는 onNodeWithText()메서드를 사용하여 액세스 할 수 있다.


항상 수동 테스트를 하며 기능들을 하나하나 체크하고 잇었는데 Compose Codelab을 진행하다가 자동 테스트에 대해 알게 되었고 로컬 테스트와 계측 테스트를 진행하면서 여태까지 이걸 왜 몰랐지 라는 생각이 들었다.

앞으로 기능을 작성할 때마다 로컬 테스트를 통해 내가 예상한 값과 잘 나오는지, 앱을 완성한 뒤 계측 테스트를 통해 ui가 적절하게 동작하는지 확인해보면서 하면 더 재미나게 개발 공부를 할 수 있을 것 같다.
참고문헌
https://developer.android.com/codelabs/basic-android-kotlin-compose-write-automated-tests?hl=ko&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-2-pathway-3%3Fhl%3Dko%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-write-automated-tests#0
profile
개발하는 꿈나무
post-custom-banner

0개의 댓글