top of page
Matt

Espresso 테스트에서 애니메이션 버튼을 클릭하기 전에 효과적으로 기다리는 방법

서론

안드로이드에서 애니메이션 UI 요소를 테스트하는 것은 어려울 수 있습니다, 특히 Espresso와 같은 자동화 테스트 프레임워크를 사용할 때. 애니메이션이 진행 중인 버튼과 상호작용을 시도할 때 일반적인 문제가 발생합니다. 이 글은 애니메이션 버튼에 대한 작업을 수행하기 전에 Espresso 테스트가 애니메이션 완료를 기다리도록 하는 해결책을 안내할 것입니다.


배경

Espresso는 안드로이드 UI 테스트를 위한 강력한 도구로, 개발자들이 간결하고 신뢰할 수 있는 자동화된 UI 테스트를 작성할 수 있게 해줍니다. 하지만 애니메이션의 비동기적 특성 때문에 Espresso로 애니메이션을 테스트하는 것은 까다로울 수 있습니다. 표준 Espresso 메서드는 이동하거나 상태가 변경되는 UI 요소와 제대로 상호작용하지 못할 수 있습니다.


상세한 문제

화면으로 슬라이드되거나 동적으로 위치가 변경되는 버튼이 있는 시나리오를 고려해 보세요. 표준 Espresso 동작인 click()은 버튼이 최종 위치에 정착하기 전에 버튼과 상호작용을 시도할 수 있어 클릭 누락과 불안정한 테스트로 이어질 수 있습니다.


제안된 해결책

이를 해결하기 위해, 우리는 맞춤 Espresso 함수를 만들 수 있습니다: waitUntilAnimatedButtonClickable. 이 함수는:

  1. 버튼이 애니메이션을 완료할 때까지 기다립니다.

  2. 추가적인 작업을 진행하기 전에 버튼이 클릭 가능한지 확인합니다.


단계별 구현

  • 맞춤 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


조회수 0회
bottom of page