서론
안드로이드에서 애니메이션 UI 요소를 테스트하는 것은 어려울 수 있습니다, 특히 Espresso와 같은 자동화 테스트 프레임워크를 사용할 때. 애니메이션이 진행 중인 버튼과 상호작용을 시도할 때 일반적인 문제가 발생합니다. 이 글은 애니메이션 버튼에 대한 작업을 수행하기 전에 Espresso 테스트가 애니메이션 완료를 기다리도록 하는 해결책을 안내할 것입니다.
배경
Espresso는 안드로이드 UI 테스트를 위한 강력한 도구로, 개발자들이 간결하고 신뢰할 수 있는 자동화된 UI 테스트를 작성할 수 있게 해줍니다. 하지만 애니메이션의 비동기적 특성 때문에 Espresso로 애니메이션을 테스트하는 것은 까다로울 수 있습니다. 표준 Espresso 메서드는 이동하거나 상태가 변경되는 UI 요소와 제대로 상호작용하지 못할 수 있습니다.
상세한 문제
화면으로 슬라이드되거나 동적으로 위치가 변경되는 버튼이 있는 시나리오를 고려해 보세요. 표준 Espresso 동작인 click()은 버튼이 최종 위치에 정착하기 전에 버튼과 상호작용을 시도할 수 있어 클릭 누락과 불안정한 테스트로 이어질 수 있습니다.
제안된 해결책
이를 해결하기 위해, 우리는 맞춤 Espresso 함수를 만들 수 있습니다: waitUntilAnimatedButtonClickable. 이 함수는:
버튼이 애니메이션을 완료할 때까지 기다립니다.
추가적인 작업을 진행하기 전에 버튼이 클릭 가능한지 확인합니다.
단계별 구현
맞춤 ViewAction 생성:
fun ViewInteraction.waitUntilAnimatedButtonClickable(timeoutInMs: Long = 5_000): ViewInteraction {
val endTime = System.currentTimeMillis() + timeoutInMs
val waitForAnimationToEnd = object : ViewAction {
override fun getConstraints(): Matcher<View> = isDisplayed()
override fun getDescription(): String = "wait for animation to end"
override fun perform(uiController: UiController, view: View) {
var lastYPosition = -1f
var lastXPosition = -1f
while (System.currentTimeMillis() < endTime) {
if (lastYPosition == view.y && lastXPosition == view.x) {
return
}
lastYPosition = view.y
lastXPosition = view.x
uiController.loopMainThreadForAtLeast(50)
}
throw AssertionError("Timeout waiting for the animation to finish")
}
}
perform(waitForAnimationToEnd)
return waitUntilCondition(isClickable(), timeoutInMs)
}
여기서, 우리는 버튼의 위치가 안정되었는지 확인하는 ViewAction을 생성합니다, 이는 애니메이션의 끝을 나타냅니다.
애니메이션 확인과 클릭 가능성 결합:
private fun ViewInteraction.waitUntilCondition(
condition: Matcher<View>,
timeout: Long
): ViewInteraction {
val endTime = System.currentTimeMillis() + timeout
while (System.currentTimeMillis() < endTime) {
try {
check(matches(condition))
return this
} catch (e: AssertionError) {
Thread.sleep(50)
}
}
throw AssertionError("Timeout waiting for condition")
}
이 코드 스니펫은 애니메이션 확인을 버튼이 클릭 가능한지 검증하는 조건과 결합하는 방법을 보여줍니다.
테스트에서 맞춤 함수 사용:
onView(withId(R.id.topScoreButton))
.waitUntilAnimatedButtonClickable()
.perform(click())
애니메이션 버튼과 상호작용하기 위해 이 함수를 Espresso 테스트에서 사용하는 예시입니다.
이 접근법의 장점
이 방법은 당신의 Espresso 테스트가 더 신뢰할 수 있고 실제 사용자 상호작용을 반영하도록 보장합니다. 애니메이션을 고려함으로써, 불안정한 테스트의 일반적인 함정을 피하고 자동화된 테스트가 사용자 행동을 정확하게 시뮬레이션하도록 합니다.
결론
정확한 UI 테스트는 견고하고 사용자 친화적인 안드로이드 애플리케이션을 만드는 데 중요합니다. waitUntilAnimatedButtonClickable 함수를 사용하여, 당신은 애니메이션 UI 요소를 효과적으로 처리하기 위해 Espresso 테스트를 강화할 수 있습니다. 이 접근법은 더 신뢰할 수 있고 정확하며 사용자 중심의 자동화된 테스트를 향한 한 걸음입니다.
지원 방법
이 내용은 항상 무료로 유지될 것이며, 가치 있다고 생각하신다면 다른 사람들과 공유하는 것을 고려해 주세요. 또한, 우리 게임을 다운로드하고 솔직한 리뷰를 남겨주시면 큰 도움이 됩니다. 질문이나 피드백이 있으시면 언제든지 연락 주시고, 최선을 다해 응답하겠습니다.
오늘 애플 앱 스토어에서 Falling Sky를 다운로드하세요: https://apps.apple.com/app/id6446787964
X에서 우리를 팔로우하세요: https://x.com/_kingdomarcade