Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Jetpack Composeから始める、頑張らないVRT
Search
Yasuhiro Shimizu
August 18, 2022
Programming
0
1.1k
Jetpack Composeから始める、頑張らないVRT
Yasuhiro Shimizu
August 18, 2022
Tweet
Share
More Decks by Yasuhiro Shimizu
See All by Yasuhiro Shimizu
Kotlin Multiplatform Projectを導入してみて
yshrsmz
1
1.1k
BIP39について
yshrsmz
0
170
Android Fireside Chatまとめ
yshrsmz
3
2.2k
RxJava1からRxJava2へ
yshrsmz
0
100
Other Decks in Programming
See All in Programming
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
170
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
350
5つのアンチパターンから学ぶLT設計
narihara
1
110
WindowInsetsだってテストしたい
ryunen344
1
190
Blazing Fast UI Development with Compose Hot Reload (droidcon New York 2025)
zsmb
1
190
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
470
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
ReadMoreTextView
fornewid
1
460
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
100
関数型まつり2025登壇資料「関数プログラミングと再帰」
taisontsukada
2
850
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
210
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
190
Featured
See All Featured
Faster Mobile Websites
deanohume
307
31k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Typedesign – Prime Four
hannesfritz
42
2.7k
The Language of Interfaces
destraynor
158
25k
Statistics for Hackers
jakevdp
799
220k
Scaling GitHub
holman
459
140k
Thoughts on Productivity
jonyablonski
69
4.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Into the Great Unknown - MozCon
thekraken
39
1.9k
A Modern Web Designer's Workflow
chriscoyier
693
190k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Transcript
Jetpack Composeから始 める、頑張らないVRT
自己紹介 清水泰博 Androidアプリ書いたりWebフロントエンド書いたり --- Twitter: @_yshrsmz GitHub: @yshrsmz その他: AndroidDagashiの運営とか
VRT?
VRTとは - Visual Regression Testing - 画像回帰テスト - 視覚的にリグレッションテストを行うこと -
変更前後のスクリーンショットを比較して、差分を検出する - ユニットテストでは担保しづらい、見た目をテストできる
VRTのつらいところ
VRTのつらいところ - テストケースのメンテ - 単純に書くものが増える - 実機/エミュレータを使う必要がある - 時間がかかる -
テストの実行結果が不安定 - CIで動かすにしても/SaaS 使うにしても手間がかかる - 💰💰💰 でも…
Jetpack Compose なら楽して VRT できる!
今日の内容を3行で
- airbnb/showkase で、`@Preview` Composable 関数を収集 - cashapp/paparazzi で、実機/エミュレータ不要でスクリーンショット を取得 -
reg-viz/reg-suit で、リッチなVRTレポートを作る
各ツールの紹介
airbnb/showkase - Jetpack Compose の `@Preview` からUIカタログを作るライブラリ - kapt/ksp で
`@Preview` 付き Composable の一覧を作り - その一覧を表示する Activity を提供する
cashapp/paparazzi - 安心の square 製 - 実機/エミュレータ無しで Android View や
Composable 関数を描画し、スクリーン ショットを取得できる - これ単体でも VRT を提供している
paparazzi 単体での VRT expected, actual, diff を含む画像を生成する
- showkase x paparazzi だけでも VRT はできる - しかし paparazzi
の VRT は非常にプリミティブで、レポートもない - もっとリッチに、かつ PR 上から確認できるようにしたい → reg-suit を使おう
reg-viz/reg-suit - Node.js 製の画像回帰テストツール - 画像の差分検知と、リッチなレポートサイトを提供する - GitHub 連携で簡単なレポートを表示できる -
アップロード先は S3 と GCS をサポート
None
reg-suit の比較元検出方法 - トピックブランチがマージ先から分岐したコミットに紐づくレポート
手順
https://github.com/android/nowinandroid/pull/101 “Add automatic preview screenshot testing with Paparazzi and Showkase”
showkase x paparazzi の設定はこのPRで詳しく見れます
テスト対象のモジュールに showkase を追加
テスト用モジュールの作成
src/test/kotlin/…/ScreenshotShowkaseModule showkase のエントリポイント
src/test/kotlin/…/PreviewScreenshotTests 今回のテストパラメータ - showkase の収集した Composable - テスト対象の端末 - テストしたい
Font Scale
テストの基本設定
パラメータの準備(1)
パラメータの準備(2)
テスト本体
$ ./gradlew :preview-screenshots:recordPaparazzi スクリーンショットの取得 $ ./gradlew :preview-screenshots:verifyPaparazzi 画像回帰テスト
reg-suit の設定 - Node.js が必要 - プラグインは reg-keygen-git-hash-plugin, reg-notify-github-plugin, reg-publish-s3-plugin
を選択 - 画像ディレクトリは preview-screenshots/src/test/snapshots/images を指定 - paparazzi の output ディレクトリ
AWS S3 の設定 - reg-suit のウィザードの中で作成できる - Google Cloud Storage
でも可 - Webページを公開できるように設定する
CIの設定(GitHub Actions)-1
CIの設定(GitHub Actions)-2
CIの設定(GitHub Actions)-3
CI の設定 - pull request と main ブランチへの push タイミングで実行する
- main への push タイミングは比較元のレポートを作成するため - 比較元のコミットを判別するため、git は完全なクローンが必要 - デフォルトでは depth=1 でクローンしている - detached HEAD ではなく、ブランチをチェックアウトしていること - AWS S3 へのアクセスは OIDC の設定が必要 - CodeBuild の設定するよりは遥かに楽だった (個人的感想です)
まとめ - airbnb/showkase で、`@Preview` Composable 関数を収集 - cashapp/paparazzi で、実機/エミュレータ不要でスクリーンショットを取得 -
reg-viz/reg-suit で、リッチなVRTレポートを作る
Thanks!