web-dev-qa-db-ja.com

エスプレッソテストはアニメーションを無効にします

enter image description here

@Test
    public void test3_PaySuccessful(){
        init();

    ViewInteraction amountEditText = onView(
            allOf(withId(R.id.et_amount), isDisplayed()));
    amountEditText.perform(replaceText("SGD 0.010"), closeSoftKeyboard());

    //, withText("Proceed")
    ViewInteraction appCompatButton = onView(
            allOf(withId(R.id.btn_confirm), isDisplayed()));
    appCompatButton.perform(click());

    //, withText("Pay")
    ViewInteraction appCompatButton2 = onView(
            allOf(withId(R.id.btn_confirm), isDisplayed()));
    appCompatButton2.perform(click());

    //dialog
    ViewInteraction appCompatButton3 = onView(
            allOf(withId(R.id.confirm_button), withText("Confirm"), isDisplayed()));
    appCompatButton3.perform(click());

    //have to disable animation in order to pass this.
    intended(CoreMatchers.allOf(hasComponent(PaymentSelectionActivity2.class.getName())));

}

アニメーションを含むビューでエスプレッソのテストを行うと問題が発生しました。エスプレッソはアニメーションを処理できないことがわかっているので、以下で説明しました。 -テストデバイスのウィンドウアニメーション、トランジションアニメーション、アニメーターの継続時間スケールをすべてオフに設定します(これは機能しません)-コードにフラグを追加しようとしました。 espresso_testing = true。 trueの場合、コードはすべてのstartAnimation()関数呼び出しの呼び出しをスキップします。 --->これは機能しています。ただし、エスプレッソテストケースの作成中にアプリのコードを変更できないという要件があります。上記のテストケースが含まれています。

これを行う他の方法はありますか?前もって感謝します。

17
kggoh

プラグインを常に最新の状態に保つようにしてください:

buildscript {
  repositories {
    google()
    gradlePluginPortal()
  }

  dependencies {
    classpath 'com.Android.tools.build:gradle:3.3.0'
  }
}

testOptionsと呼ばれるanimationsDisabledの新しいフラグを使用:

Android {

  ...

  testOptions {
    animationsDisabled = true
  }
}

出典:https://google.github.io/Android-gradle-dsl/current/com.Android.build.gradle。 internal.dsl.TestOptions.html#com.Android.build.gradle.internal.dsl.TestOptions:animationsDisabled

デバイス/エミュレータのアニメーションを手動でオフにしてみてください:

不安定を避けるため、テストに使用する仮想デバイスまたは物理デバイスでシステムアニメーションをオフにすることを強くお勧めします。デバイスの[設定]> [開発者オプション]で、次の3つの設定を無効にします。

ウィンドウアニメーションスケールトランジションアニメーションスケールアニメーターデュレーションスケール

出典:https://developer.Android.com/training/testing/espresso/setup#set-up-environment

コマンドラインでadbを使用してみてください:

# Turn off animations
adb Shell settings put global window_animation_scale 0 &
adb Shell settings put global transition_animation_scale 0 &
adb Shell settings put global animator_duration_scale 0 &

出典:https://github.com/jaredsburrows/Android-gif-example/blob/master/.travis.yml#L34

LinkedInのTestButlerを試すことができます

TestButler.verifyAnimationsDisabled(InstrumentationRegistry.getTargetContext());

出典:https://github.com/linkedin/test-butler/blob/master/test-butler-demo/src/ androidTest/Java/com/linkedin/Android/testbutler/demo/AnimationDisablerTest.Java#L26

エスプレッソテスト用にTestRuleおよびGradleタスクを作成してみてください:

出典:https://product.reverb.com/disabling-animations-in-espresso-for-Android-testing-de17f7cf236f

57
Jared Burrows

確かに、本番コードにテストコードを追加するべきではありません。ここでの問題はアニメーションにあります。 HandlersRunnablesを使用してアニメーションを実行している場合、開発者オプションを使用してそれらをオフにすることはできません。これを使用してアニメーション化する一般的な場所は、カスタムビューです。

ただし、カスタムビューでも、ValueAnimatorObjectAnimator、またはAnimatorSetのいずれかを使用してアニメーションを実行してください。開発者オプションでAnimator duration scaleをオフにして、アニメーションをオフにすることができます。

適切なリファレンスはProgressBarです。

1
Henry

これを見ることができます repo

プロジェクトをビルドし、生成された.apkファイルをダウンロードし、そのプロジェクトに記載されている指示に従ってアニメーションを無効にします。その後、スムーズに航行できるはずです。他の多くのソースから同じ.apkファイルをダウンロードすることもできます。 .apkファイルを入手したら、次のコマンドを発行します。

adb install -r Android_emulator_hacks.apk
adb Shell pm grant no.finn.Android_emulator_hacks Android.permission.SET_ANIMATION_SCALE
adb Shell am start -n no.finn.Android_emulator_hacks/no.finn.Android_emulator_hacks.HackActivity

これにより、システムアニメーションが無効になります。

1
mark w.