Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
複数端末で Visual Regression Test を 実行する上での工夫と課題
Search
Kurumi Morimoto
November 10, 2023
Programming
4.1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
複数端末で Visual Regression Test を 実行する上での工夫と課題
Shibuya.apk #45 の発表資料です
Kurumi Morimoto
November 10, 2023
More Decks by Kurumi Morimoto
See All by Kurumi Morimoto
GraphQLの魅力を引き出すAndroidクライアント実装
morux2
3
4.8k
Istio integrated Telepresence
morux2
9
9k
Other Decks in Programming
See All in Programming
AIエージェント時代のコードレビューを設計する
nogu66
6
2.6k
フロントエンドUIフレームワークのこれまでとこれから
ssssota
3
1.7k
ALB ログから Trace を気合で繋げる技術
fohte
7
880
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
4
3.8k
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
Foundry Localでエージェント開発
seosoft
0
160
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
140
業務時間外もAIに働いてもらう話
colorful12
3
10k
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
240
Unsuck your backbone
ammeep
672
58k
Building an army of robots
kneath
306
46k
Rails Girls Zürich Keynote
gr2m
96
14k
New Earth Scene 8
popppiees
3
2.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Everyday Curiosity
cassininazir
0
310
Being A Developer After 40
akosma
91
590k
Abbi's Birthday
coloredviolet
3
9.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Exploring anti-patterns in Rails
aemeredith
3
500
Transcript
複数端末で Visual Regression Test を 実行する上での工夫と課題 2023-11-10 @morux2 Shibuya.apk #45
• 森本くるみ / @morux2 • Android Engineer • 株式会社リクルート 自己紹介
_morux2 morux2 2
スタディサプリ小学講座・中学講座 • 小学1年生および中学生向け (2023.11.10時点) • 月額制のオンライン学習サービス https://play.google.com/store/apps/details?id=jp.studysapuri.tara 3
スタディサプリ小学講座・中学講座 2023.11.10時点 4
Visual Regression Test (VRT) とは • 画像比較によるUIの回帰テスト • 変更前後のコードそれぞれに対する画面のスクリーンショットを比較し、意図 しない差分を検知することが可能
5
スタディサプリ小学講座・中学講座のVRT 6
スタディサプリ小学講座・中学講座のVRT 7
今日話すこと 複数端末で Visual Regression Test を 実行する上での工夫と課題 8
TL;DR • Showkase + Roborazzi + reg-suit を採用 • Previewアノテーションを独自に定義し複数デバイスでの撮影を実現
• Showkaseの内部実装に依存した運用になっており課題も残る 9
Agenda | 01 02 03 スタディサプリ小学講座・中学講座のVRTの構成 複数端末でVRTを実行する上での工夫 現状の課題 10
スタディサプリ小学講座・中学講座の VRTの構成 01 11
VRTの3ステップ • 画面の用意 • 撮影 • 比較 12
VRTの3ステップ • 画面の用意 ◦ Showkase • 撮影 ◦ Roborazzi •
比較 ◦ reg-suit 13
画面の用意 / Showkase • アノテーションプロセッサをベースにしたライブラリ • @PreviewのついたComposableをリスト形式で一括で取得できる https://github.com/airbnb/Showkase 14
画面の用意 / Showkase 自動生成 15
撮影 / Roborazzi • 実機不要でJVM上で撮影すること可能 (UnitTestで書ける) • Robolectricのグラフィック機能(RNG)がベースとなっている • nowinandroidでも採用
https://github.com/takahirom/roborazzi https://github.com/android/nowinandroid/pull/876 16
撮影 / Roborazzi 17
Showkase + Roborazzi 18
Showkase + Roborazzi 19
比較 / reg-suit • 画像の差分をHTMLレポートとして出力 • 外部のクラウドストレージへ撮影した画像をよしなに保管してくれる • Slackの通知やPRのコメントも設定可能 https://github.com/reg-viz/reg-suit
設定方法は割愛しますので、詳しくは以下をご確認ください 20
プロダクトでのVRT実行の流れ ラベルを付与するとGHAが実行される (roborazziとreg-suitが走る) 21
プロダクトでのVRT実行の流れ 22
プロダクトでのVRT実行の流れ 23
[まとめ] スタディサプリ小学講座・中学講座のVRTの構成 • 画面の用意 (Showkase) ◦ @PreviewのついたComposableをリスト形式で一括で取得 • 撮影 (Roborazzi)
◦ ComposableのリストをParameterizedテストに渡して captureRoboImage() メソッドで撮影 • 比較 (reg-suit) ◦ 変更前後の画像をクラウドストレージで保管し、差分をPRにコメント ・Slackに通知 01 24
余談 Roborazziを導入した理由は? 25
余談 / Roborazzi導入の経緯 https://blog.studysapuri.jp/entry/2023/10/05/introduce-roborazzi 26
余談 / Roborazzi導入の経緯 • JVM上で撮影できるライブラリとしてPaparazziとRoborazziを検討 • スクロールした画面ができるRoborazziを採用 • RoborazziのREADMEでも、UI操作ができる点が優位性の1つに挙げられて いる
https://github.com/takahirom/roborazzi#paparazzi-and-roborazzi-a-comparison 27
複数端末でVRTを実行する上での工夫 02 28
実現したいこと 複数のデバイスでVRTを実行したい! 29
悩ましいこと • 撮影するPreviewは絞らず、なるべく多くの状態を網羅したい ◦ チェックボックスのon/off, ボタンのenable/disable … • 全てのPreviewを複数端末で撮影するとキリがない ◦
我々のプロダクトでは約300ほどのPreviewが存在する ◦ 撮影する端末を増やすたびに出力画像が2, 3倍...と増えていく 30
複数デバイスでの撮影方針 • UIコンポーネントは状態を網羅し単一のデバイスで撮影 • スクリーンは複数端末で撮影 31
UIコンポーネントは単一のデバイスで撮影 32
スクリーンは複数端末で撮影 33
UIごとに撮影する端末を切り替えるための工夫 Previewアノテーションを独自に定義する 34
定義したPreviewアノテーション 35
アノテーションの使用例 (UIコンポーネント) どの端末でも共通のコンポーネントは プレビューと撮影は単一デバイスで実施 36
アノテーションの使用例 (UIコンポーネント) 端末サイズごとにデザインが変わるコンポーネントは プレビューと撮影を複数デバイスで実施 37
アノテーションの使用例 (スクリーン) マルチプレビューアノテーションを使って プレビューと撮影を複数デバイスで実施 38
アノテーションのgroup名で撮影するデバイスを決定 39
複数デバイスでの撮影 40
単一のデバイスでの撮影 41
余談 / プロダクト特有の事情 • タブレット専用 (小学講座) / スマホ・タブレット両者対応 (中学講座) •
UIによって撮影したいデバイスが異なっている 2023.11.10時点 42
余談 / 実際のプロダクトでのアノテーションの運用 小学講座にはElementaryをgroup名に含める 43
余談 / 実際のプロダクトでのアノテーションの運用 中学講座にはJuniorHighをgroup名に含める 44
余談 / 実際のプロダクトでのアノテーションの運用 45
余談 / 実際のプロダクトでのアノテーションの運用 46
[まとめ] 複数端末でVRTを実行する上での工夫 • UIコンポーネントは単一のデバイス・スクリーンは複数端末で撮影 • 撮影する端末を切り替えるためにPreviewアノテーションを独自定義 • Previewのgroup名から撮影する端末を振り分ける 02 47
現状の課題 03 48
課題① マルチPreviewアノテーション 49 @Previewを連ねた数だけComponentが出力される
課題① マルチPreviewアノテーション 50 @Previewを連ねた数だけ 同じ画面が撮影されてしまう
課題② Preview Parameter 51 List形式でComponentが出力される
課題② Preview Parameter 52 componentのgroupとnameは同一なので ファイル名が重複して上書きされてしまう
53 合体!
54 🤯🤯🤯
回避策① マルチPreviewアノテーション 55 Parameterizedテストに渡す前に重複を排除
② Preview Parameter 56 使用禁止にしています...
[まとめ] 現状の課題 03 57 • Showkaseが出力するComponentListを加工するのに一手間かかる • Showkaseの内部実装に依存した運用ルールを定めてしまっている ◦ Preview
Parameterの使用を禁止している
総括 58
総括 • Showkase + Roborazzi + reg-suit を採用 • Previewアノテーションを独自に定義し複数デバイスでの撮影を実現
• Showkaseの内部実装に依存した運用になっており課題も残る 59
サンプルコードはこちら 60 https://github.com/morux2/RoborazziWithShowkaseSample
ありがとうございました