自動テストで撮ったスクリーンショットが薄い

Androidアプリの自動テストで画面キャプチャを取ると画面遷移の直後などで以下のように薄い画像を取得する場合がある。
これは画面遷移の直後でアニメーションの終了前にキャプチャを取得しているため。

薄い画像

エミュレータのアニメーションを無効にする

アニメスケールをオフにすれば一定のアニメーションを無効化できる。

設定画面からアニメーションを無効化する

事前に開発者向けオプションを有効化しておく。

開発者向けオプションを開き、以下の値を「アニメーションオフ」に設定する。

  • ウインドウアニメスケール
  • トランジションアニメスケール
  • Animator再生時間スケール

アニメスケール設定

adbコマンドでアニメーションを無効化する

上記設定をadbコマンドで行う。

adb shell settings put global window_animation_scale 0.0
adb shell settings put global transition_animation_scale 0.0
adb shell settings put global animator_duration_scale 0.0

変更後の画像

設定変更後に再度テストを実行し画面キャプチャが薄くならなければ成功。

薄くならない画像

animationsDisabled

上記設定をしてもアプリケーションレイヤーのアニメーションは無効にならない。

実行するテストがプロジェクト管理下にある場合、animationsDisabledの設定によりアプリケーションレイヤーのアニメーションも無効にできる。

testOptionsにanimationsDisabledの設定を追加する。

android {

   testOptions {
        animationsDisabled = true
   }

}

環境変数へ逃がしておくと便利。

android {

   testOptions {
        animationsDisabled = System.getenv("ANIMATIONS_DISABLED") == "true"
   }

}

設定を変更しすぎるとProductionビルドとの差異が大きくなり何をテストしているのかが分からなくなるのでチームで共有して適切に設定する。