Scrap 仕組みから理解する!Composeプレビューを様々なバリエーションでスクリーンショットテストしよう
Ref
Roborazzi + そのほか強化ツール
Google の Compose Preview Screenshot Testing も
CIはこちらをよんでくれとのこと
Preview で ローカルで 楽に画面の確認をしようぜ という考え
バリエーションを増やして テストできる範囲を増やそう
- night light
- tablet smartphone
- locales
手順的にはこれ
1, 集めて 2.撮って 3.検証する
1 集める系のライブラリ
-
- これは Previewのプロパティが一部取れない
- UI Library のcatalog を作るのが目的なので Preview 取る って用途でないため
Showkase.getMetaData().componentList : List<ShowkaseBrowserComponent>
を交差するっぽい
-
- Previewの全てのパラメータにも、Previewについたアノテーションも持って来れるとのこと
AndroidComposablePreviewScanner() : List<ComposablePreview<AndroidPreviewInfo>>
- Previewの全てのパラメータにも、Previewについたアノテーションも持って来れるとのこと
- スクショするツール
基本的に複数のライブラリを使う
-
ComposeTestRule
公式のもの。Compsableをテストするためのもの。 -
Robolectric
JVM 上 で AndroidFrameworkを実行するツール。 -
Roborazzi
Robolectric を使ってスクショを撮るライブラリ
まあ、よく見るやつ。TestRule で引っ張ってきて、 Robolectric 上で Roborazziでスクショを撮る
- テストしたいComposable関数を このテスト空間で呼び出す。
-
パラメータテストが可能
-
こちらは スクショの 保存先 path の指定 が可能
Preview で集めてきたComposable を スクショ撮るやつに食わせる形 になる
- Robolectric と Roborazzi は必須
- Showkase or Composable Preview Scanner どちらか
同じ画像が撮れるか , 画像の名称に一意性は持たせられるか の担保が必要でShowkaseと合わせると以下
CpomosablePReviewScanner もほぼ一緒
画像の名称の 一意性は別の関数になる
実行
Showkase は TestRunnerから。 ComposablePreviewScanner は ビルドスクリプトのみでいけて テストコードは自動生成してくれる
バリエーション を撮るには
Preview の 引数 で表現すれば良い
Previewへのアクセス
Previewの環境下でのスクショ
Composeの機能, Roboletricの機能 , CompopseTestrule機能 を 好きなの使い分け
Composeの場合は, CompositionLocal で 設定できる
Roboletric は APIがある
TestRule を使うと mainClock使えばAnimation を制御できる
組み合わせるとこの辺ができる
で,Robolaziが Test用のインターフェースを用意してくれているのでこれを実装すれば良い
実装したら BuildScriptから呼べば良い
まとめ
Gradle Composable Screenshot test
アニメーションはできない
バグはまだありそう
ざっとまとめ
できるようにした方が良いこと
- Preview のパラメータ による Parametarized なテストはしたいよね
- local , テーマ, fontScale , device
- (CI)
大きく方法は二つ
Roborazzi ( + ComposeTestRule + Robolectric) と ComposablePReviewScanner によるVRT
ComposablePreviewScanner が Roborazziで定義したテストロジックを使って、テストコードの生成を行う。そのテストクラスを呼ぶことでVRTを実施する。
Roborazzi 側で定義する テストロジックで 細かくテストケースを指定できるイメージ
できなそうなこと
- なさそう
Compose Preview Screenshot Testing
専用のソースセット空間から 対象のComposable関数 を 参照する。 その後 テストの実行をgradleタスクで行う。
srcSetで定義する Preview でバリエーションを表現すれば テストケースをしていできる(はず)
できなそうなこと
- アニメーションの制御はできない