PLAID Advent Calendar 2017 18日目の記事です。
- Androidのスクリーンショットテストだとsquare/spoonが少し有名ですが、もう少し新しめのライブラリでfacebook/screenshot-tests-for-androidなるものがあったので紹介します。
- こちらで紹介したwikipediaのアプリでも使われてます。
- spoonとの違いとして、スクショを保存するモードとスクショを比較してtestするモードがあります。(
recordMode
とverifyMode
)
セットアップ
-
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の依存を強制したくないとのことで、デフォルトで使われる
ScreenshotTestRunner
はInstrumentationTestRunner
を継承してる。
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でもスクリーンショットテストできるのでこちらも調べたい。