10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PLAIDAdvent Calendar 2017

Day 18

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

Last updated at Posted at 2017-12-18

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でもスクリーンショットテストできるのでこちらも調べたい。
10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?