はじめに
Google I/O '23 にて、Host-side Screenshot Testing と呼ばれるスクリーンショットテストのためのツールが発表されました。
これまで Paparazziや Showkase といったサードパーティのライブラリを組み合わせてスクリーンショットを撮っていたかと思いますが、ついに公式でサポートされる形になりそうです。
Host-side Screenshot Testing は記事執筆時点で未リリースです。Android Gradle Plugin 8.2 でリリース予定とアナウンスされています。また 実験的な機能のため内容が変更になる場合があります。
セットアップ
- Android Studio Hedgehog と Android Gradle Plugin 8.2 の環境を用意します。
-
main
やandroidTest
ディレクトリと同じ場所にscreenshotTest
ディレクトリを作成します。こちらがスクリーンショットテストのための sourceSet になるようです。
- スクリーンショットテストの対象にしたい Composable の Preview を
screenshotTest
内に作成します。通常の Preview と同じように書けばOKです。
スクリーンショットテストを実行する
リファレンスの作成
リファレンスを生成するために以下の Gradle タスクを実行します。成功するとプロジェクト内にスクリーンショットが保存されます。
リグレッションの検知
生成したリファレンスをもとにリグレッションの検知を行うには以下の Gradle タスクを実行します。
実行結果は HTML 形式のレポートで見ることができます。差分があれば分かりやすく表示されるようです。
Host-side Screenshot Testing のすごいところ
- 追加のライブラリが不要
- Jetpack Compose の Preview をそのまま流用できる
- 実機で実行するよりもかなり高速
- 実行環境に関わらず手元のマシンであっても複数の条件(画面サイズ、Theme など)でテストすることができる
Host-side Screenshot Testing の気になること
記事執筆時点では手元で試せないため、現時点で気になることを以下にまとめます。
- Multipreview annotations に対応しているか
- 一定量スクロールした状態でスクリーンショットを撮るような動的なシナリオはサポートされているか(おそらくサポート外で、Espresso 等で実現することが想定されていそう)
- Jetpack Compose に加えて View もサポートされているか(おそらくサポート外。
AndroidView
でラップすればできるかも?) - スクリーンショットをプロジェクトのディレクトリ以外の場所に置く方法はあるか(言い換えるとスクリーンショットをコミットに含めない方法はあるか)
まとめ
Google I/O '23で発表された Host-side Screenshot Testing についてまとめました。追加のライブラリが不要で通常の Preview をそのまま使えて、しかも複数の条件でスクリーンショットテストを簡単に行える点が特徴です。気になる点も残っていますが、実際に使えるようになるのがとても楽しみです。
動画
9:09〜 から