기존에 간단한 유닛 테스트를 짜보셨다면
테스트 코드에 어느정도 자신이 붙으셨을 겁니다.
하지만 UI 테스트 코드라면??
자신 있으신가요?
@Test
fun `안녕_세계`() {
// Given 초기 상태
val string1 = "Hello, "
val string2 = "World!"
// When 결과 값 획득
val result = string1 + string2
// Then 기대값과 결과 비교
val expected = "Hello, World!"
assertEquals(expected, result)
}
굉장히 흔한 유닛 테스트 코드죠?
given when then의 형식으로 짜는게 정석입니다.
그렇다면 compose 테스트코드는 어떨까요?
composeTestRule{.finder}{.assertion}{.action}
compose의 테스트 코드는 이런 형식으로 구성됩니다.
흠... 아직은 감 안잡히시죠?
@Composable
fun TestScreen() {
val isClick = remember { mutableStateOf(false) }
Button(onClick = {isClick.value = !isClick.value}) {
Text(text = if(!isClick.value) "click!" else "clicked")
}
}
해당 composable 함수를 테스트 해봅시다.
1.버튼이 존재하는지
2.버튼이 UI에 표시되는지
3.버튼을 눌렀을때 제대로 동작하는지
이 세가지를 테스트 해봅시다.
androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.5.4")
debugImplementation("androidx.compose.ui:ui-test-manifest:1.5.4")
해당 의존성을 App gradle에 추가해주세요
class ScreenTest {
}
androidTest 폴더 안에 테스트 클래스를 생성해 줍시다.
@get:Rule
val composeRule = createComposeRule()
해당 코드를 추가해서 compose를 테스트 할 수 있게 준비해줍시다.
@Test
fun `버튼이_존재하는지_확인한다`(){
composeRule.setContent {
TestScreen()
}
composeRule.onNodeWithText("click!").assertExists()
}
setContent에 테스트에 사용할 UI를 지정해줍시다.
composeRule -> TestScreen 에 있는 요소를 탐색할거야!
.onNodeWithText("click!") -> click! 이라는 Text를 가진 UI 요소(노드)를 찾고싶어!
.assertExists() -> 해당 노드는 존재해?
대충 이런 느낌입니다.
생각보다 별거 없죠?
@Test
fun `버튼이_표시되는지_확인한다`(){
composeRule.setContent {
TestScreen()
}
composeRule.onNodeWithText("click!").assertIsDisplayed()
}
assertIsDisplayed 이거 하나만 바뀌었습니다.
@Test
fun `버튼이_동작하는지_확인한다`(){
composeRule.setContent {
TestScreen()
}
//when
composeRule.onNodeWithText("click!").performClick()
//then
composeRule.onNodeWithText("clicked").assertIsDisplayed()
}
이번엔 버튼을 클릭했을때! 를 테스트 하고싶으니
performClick으로 action을 취해야겠죠?
그럼 이제 clicked가 버튼에 표시되는것을 확인하면 테스트가 성공합니다.
한줄로 테스트 할 수도 있고
compose 테스트도 마찬가지로
given when then 형식으로 테스트 할 수도 있습니다.
테스트 코드를 짜면 코드 변경으로 인한 부작용도 예방하고
리팩토링할 때 테스트과 통과 함으로써 확신도 가질 수 있게됩니다.
열심히 짜는 습관을 들이도록 해요!
다음 포스트에선 실제 앱 UI를 어떻게 테스트 할 지 다루도록 하겠습니다.
https://developer.android.com/codelabs/jetpack-compose-testing?hl=ko#0