UI 변경 사항에 대해 자동 동기화를 진행하는 Compose Test API Assertion만 쓰면 되지, 왜 일반적인 test assertions도 함께 활용하는 걸까?
Android 앱 테스트의 기본사항 | Test your app on Android | Android Developers
Semantics | Jetpack Compose | Android Developers
테스트 API | Jetpack Compose | Android Developers
하기 모든 내용은 위 레퍼런스에 기재되어 있다.
Compose Test API에서 제공하는 assertion으로, Compose UI Semantics Tree를 대상으로 한다.
일반적인 로직 테스트만을 주로 다루던 우리에게는 상당히 생소한 UI 테스트 개념이다.
composeTestRule
.onNodeWithText("카드")
.assertExists() 화면에 ‘카드’라는 텍스트가 보이는지 여부처럼, UI에 드러난 결과를 검증할 때는 UI 테스트이므로 Compose Test API를 사용하는 것이 적절하다.일반적인 kotlin.test assertion으로, 반드시 JUnit과 함께 쓰이는 것은 아니지만 우리가 늘 볼 Android/JVM 환경에서는 보통 JUnit 계열 구현과 함께 사용된다. test 어노테이션을 열어보았을 때, 아래의 예시를 볼 수 있다.
/**
* @test annotation
*/
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@file:JvmPackageName("kotlin.test.junit.annotations")
package kotlin.test
public actual typealias Test = org.junit.Test
public actual typealias Ignore = org.junit.Ignore
public actual typealias BeforeTest = org.junit.Before
public actual typealias AfterTest = org.junit.After
WaitForIdle()등과 함께 사용한다.composeTestRule.waitForIdle()
assertEquals(Success, viewModel.state.value) 위의 예시는 필자가 임의로 작성한 ‘ViewModel의 상태 값이 Success인지 검증’하는 코드인데, UI 검증이 아니라 순수 값 검증이므로 General Test Assertion을 사용한다.따라서 그럼 그냥
Compose Test API만 쓰면 되지 않나? 라는 질문의 답은아니다.
WaitForIdle()을 붙여가면서 쓰는 것은, Kotlin test assertion으로 Compose UI에서 파생된 값을 안전하게 읽고 싶을 때를 위한 보조 수단이라서 그런 것이지, Kotlin test assertion이 Compose assertion의 상위 호환이라서가 아니다.waitForIdle()은 Compose 테스트가 추적하는 UI 작업이 idle 상태가 될 때까지 기다리기 위한 도구로 볼 수 있다.waitForIdle()로 Compose 테스트가 추적하는 UI 작업이 idle 상태가 될 때까지 기다린 뒤, 일반적인 Kotlin test assertion으로 값을 검증할 수 있다.UI 테스트만을 고려했던 질의였는데, 결과적으로 크게 의미가 없었던 질문이었다. 다만, 이를 계기로 레퍼런스를 살펴보며 나름대로 학습을 할 수 있었으니 오히려 좋았다고 하자.