top of page
Matt

エスプレッソテストでアニメーションボタンをクリックする前に効果的に待つ方法

序章

AndroidでアニメーションされたUI要素をテストすることは、特にEspressoのような自動テストフレームワークを使用する際には難しいことがあります。アニメーション中のボタンとのやり取りを試みる際に一般的な問題が発生します。この投稿は、アニメーションされたボタンに対して何らかのアクションを実行する前に、Espressoテストがアニメーションの完了を待つことを保証する解決策をご紹介します。


背景

EspressoはAndroid 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テストは、堅牢でユーザーフレンドリーなAndroidアプリケーションを作成するために重要です。waitUntilAnimatedButtonClickable関数を使用することで、アニメーションされたUI要素を効果的に扱うEspressoテストを強化できます。このアプローチは、より信頼性が高く、正確で、ユーザー中心の自動テストへの一歩です。


サポート方法

このコンテンツは常に無料で提供され、価値があると感じた場合は、他の人と共有していただくことをご検討ください。また、私たちのゲームをダウンロードし、正直なレビューを残していただくことは、私たちを大いにサポートします。質問やフィードバックがあればお気軽にお問い合わせください。最善を尽くして対応します。


今すぐApple App StoreからFalling Skyをダウンロード: https://apps.apple.com/app/id6446787964


Xで私たちをフォロー:https://x.com/_kingdomarcade


閲覧数:2回
bottom of page