Android
test
テスト
PLAIDDay 18

facebook/screenshot-tests-for-android でスクリーンショットテスト

PLAID Advent Calendar 2017 18日目の記事です。

  • Androidのスクリーンショットテストだとsquare/spoonが少し有名ですが、もう少し新しめのライブラリでfacebook/screenshot-tests-for-androidなるものがあったので紹介します。
  • こちらで紹介したwikipediaのアプリでも使われてます。
  • spoonとの違いとして、スクショを保存するモードとスクショを比較してtestするモードがあります。(recordModeverifyMode)

セットアップ

  • OSXとLinuxのみサポートされてる。

  • python-2.7と画像比較に使われるpython-pillowが必要。

pip install pillow
  • build.gradleに依存関係とapply pluginを追記。
build.gradle
  buildscript {
    // ...
    dependencies {
      // ...
      classpath 'com.facebook.testing.screenshot:plugin:0.5.0'
    }
  }
  apply plugin: 'com.facebook.testing.screenshot'
  • testing-support-libの依存を強制したくないとのことで、デフォルトで使われるScreenshotTestRunnerInstrumentationTestRunnerを継承してる。 AndroidJUnitRunnerや自前のTestRunnerを使いたければ、TestRunnerのonCreate()finish()で下記のようにScreenshotRunnerのメソッドを呼び出す。
CustomTestRunner.java
public class CustomTestRunner extends AndroidJUnitRunner {

    @Override
    public void onCreate(Bundle arguments) {
        ScreenshotRunner.onCreate(this, arguments);
        super.onCreate(arguments);
    }

    @Override
    public void finish(int resultCode, Bundle results) {
        ScreenshotRunner.onDestroy();
        super.finish(resultCode, results);
    }
}
  • build.gradleにもCustomTestRunnerの利用を設定(上書きされないようapply plugin: 'com.facebook.testing.screenshot'よりも後に書く)
build.gradle
android {
    // ...
    defaultConfig {
        // ...
        testInstrumentationRunner "com.example.takaaki.screenshotsample.CustomTestRunner"
    }
  • screenshotは一時的に端末内に掻き出されるのでWRITE_EXTERNAL_STORAGEのパーミッションをアプリに追加。
AndroidManifest.xml
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 以上で./gradlew screenshotTestsでテストを実行し生成されたスクショ一覧をreportとして見れる。

運用

  • ./gradlew recordMode screenshotTestsでテストを実行すればapp/screenshots以下にscreenshotが保存される。UI変更の修正をした時はこれを実行しスクショもコミットすれば良さそう。

  • CIでは./gradlew verifyMode screenshotTests
    で実行することで、生成されたスクショとapp/screenshots以下のスクショが等しいかをテストすれば良さそう。

結び

  • サンプルアプリはtakaaki7/ScreenshotTestSampleにあげました。
  • Firebase Test Lab for Androidでもスクリーンショットテストできるのでこちらも調べたい。