Automatic screenshot testing for all your Compose @Previews
日付:2022/01/05
URL:https://proandroiddev.com/automatic-screenshot-testing-for-all-your-compose-previews-6add202fecc7
調査者:Mori Atsushi
カテゴリ:Test
一言で表すと
全ての@PreviewsがついたComposableのスクリーンショット撮るよ
概要
記事の内容
Showkase: UI Catalog Library
@Preview を自動でリスト化してくれる
デザイナー、QA、PMとのコミュニケーションが円滑になる
最近スクリーンショットのフックを追加しました
screenshot-tests-for-android(facebook) スクリーンショットを撮ってくれるツール
スクリーンショットを撮って比較してくれるツール
Shots もいいよ
統合
JLL Jet で試した
Sample を公開した
code:kotlin
@ShowkaseScreenshot(rootShowkaseClass = ShowkaseRoot::class)
abstract class ComposeTests : ShowkaseScreenshotTest {
override fun onScreenshot(
id: String,
name: String,
group: String,
styleName: String?,
screenshotType: ShowkaseScreenshotType,
screenshotBitmap: Bitmap
) {
val view = ImageView(InstrumentationRegistry.getInstrumentation().context)
view.setImageBitmap(screenshotBitmap)
ViewHelpers.setupView(view).setExactWidthPx(screenshotBitmap.width).setExactHeightPx(screenshotBitmap.height).layout()
Screenshot.snap(view).setName("$group - $name").record()
}
}
コマンド
code:shell
# スクリーンショットを含むHTMLレポートを書き出す
./gradle runDebugAndroidTestScreenshotTest
# すべてのスクリーンショット画像ファイルをフォルダに保存する
./gradle recordDebugAndroidTestScreenshotTest
# 前回のスクリーンショットと比較する
./gradle verifyDebugAndroidTestScreenshotTest
今後はCIで継続的に動かすことをやりたい
Showkaseの実装
captureToImage でbitmapを作成している
code:kotlin
@RequiresApi(Build.VERSION_CODES.O)
fun takeComposableScreenshot(
showkaseBrowserComponent: ShowkaseBrowserComponent
) {
// Disable animations for screenshots to make them deterministic
composeTestRule.mainClock.autoAdvance = false
composeTestRule.setContent { showkaseBrowserComponent.component() }
val bitmap = composeTestRule.onRoot().captureToImage().asAndroidBitmap()
onScreenshot(
id = showkaseBrowserComponent.componentKey,
name = showkaseBrowserComponent.componentName,
group = showkaseBrowserComponent.group,
styleName = showkaseBrowserComponent.styleName,
screenshotType = ShowkaseScreenshotType.Composable,
screenshotBitmap = bitmap,
)
}
@ShowkaseScreenshot がついたクラスからkspでテストファイルを自動生成してるっぽい
ShowkaseScreenshotTestWriter
screenshot-tests-for-android(facebook) の実装
javaで読むの辛い…
気になるポイント
一度bitmap化してからImageViewで表示して再度captureするの無駄が多そう
@Previews あんまり使ってないんだけど、みんなどうしてるんだろう…?
productのmoduleにdummy dataとかが入るのが嫌…
mayamito.icon 使ってるけどdummy dataの用意がめんどいよね
Katalogでもスクリーンショット連携を提供しようとしています
画像ファイルの保存場所困ってる
テストを動かしているデバイスに保存される
コメント
Go.icon @Preview がプロダクトコードにいっぱい書かれすぎると「いいのかな〜🤔」と不安になる
mayamito.icon むしろtest以下に@Previewを書いてもいいのか?でも実装した場所と分かれるのはそれはそれでどうなんだ
saku.icon @Preview 向けのコーディング規約的な何かが求められるようになりそう
Mori Atsushi.icon うちの構成
code:kotlin
feature/xx
testImplement dummy
dummy
appCatalog
implement dummy
ここでPreview用のコードを書く