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
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
MasatoHaruta
May 21, 2024
Programming
89
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test.pdf
MasatoHaruta
May 21, 2024
More Decks by MasatoHaruta
See All by MasatoHaruta
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test__1_.pdf
blurfour
0
16
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test__2_.pdf
blurfour
0
27
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
210
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
140
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
Agents on Rails - Rails at Scale 2026
irinanazarova
0
560
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
260
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
250
golang-bob.pdf
iwatsukayura
0
130
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
Designing for Performance
lara
612
70k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
How to Ace a Technical Interview
jacobian
280
24k
Making Projects Easy
brettharned
120
6.8k
BBQ
matthewcrist
90
10k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Documentation Writing (for coders)
carmenintech
77
5.6k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
Transcript
CIを用いたAndroidのAPI29以上での Visual Regression Test Last updated:2024.05.21 NewsPicks Android Engineer /
Masato Haruta
00 自己紹介 ©NewsPicks Inc. All Rights Reserved. Masato Haruta
NewsPicks Androidエンジニア
1. VRT導入経緯 2. API28の壁 3. API29以上でVRTを手動実行する方法 4. VRTとCIを連携し、毎晩自動実行する 5. まとめ
00 目次 ©NewsPicks Inc. All Rights Reserved.
01 VRT導入経緯 ©NewsPicks Inc. All Rights Reserved. 特定のユーザーに対してや特定のタイミングでしか出ないモジュールがあったり、 実装上の都合で影響が広範囲に及ぶケースもあるため、
確認事項も多いことから抜け漏れが多々あった。 VRTを自動化して毎晩テストをすることで上記は解消できそうだ、となり導入することになりました。
02 API28の壁 ©NewsPicks Inc. All Rights Reserved. 2023年夏頃導入決定(この時の最新OSはAPI33) 見渡す限り参考になりそうな導入事例サイトは全て API28以下のものばかり
試しにAPI29にして、多くの参考サイトで使われていた Google製のScreenShotterで動作させてみる→ どうやらスクリーンショットを保存する場所が NG ※ScreenShotterを使う最大のメリットは、スクリーンショットを撮ったら端末内への保存及びテスト実行 環境のローカルにコピーしてくれるという 2つだが、これがAPI29以上ではエラーになるため使えない
03 API29以上でVRTを手動実行する方法 ©NewsPicks Inc. All Rights Reserved. スクリーンショットを保存する場所を変えればよかったので諸々の理由から /sdcard/Android/media/com.hoge/
に置くことで回避しました (上記パスはgetExternalMediaDirsで取得したものになります ) 実際にスクリーンショットを撮る方法ですが、 UiDevice#takeScreenshotを採用しました ここまで来たら、reg-cliを使って正解データと端末保存されたデータで VRTが実行可能となります 例えば以下のような adbコマンドで簡単に端末保存されたものを取り出せます $ adb pull $(adb shell 'ls /sdcard/Android/media/com.hoge/screenshottest_*.png') .
04 VRTとCIを連携し、毎晩自動実行する ©NewsPicks Inc. All Rights Reserved. 1. CI経由でFirebaseTestLabにあるAndroid端末を起動し、テストを実行
2. テスト実行内で所定の画面のスクリーンショットを撮り、端末内に保存 3. 上記2で端末内に保存したスクリーンショットを実行環境のローカルにコピー 4. reg-suitを用いて上記3でコピーしたスクリーンショットと、予め GoogleCloudStorageに置いてあ る正解データとでテストを実行 5. 結果をSlackに通知
04 実装例1(bitrise.ymlのFirebase設定部分抜粋) ©NewsPicks Inc. All Rights Reserved. - virtual-device-testing-for-android@1: inputs:
- test_type: instrumentation - test_timeout: '3600' - inst_test_targets: "$E2E_CLASS" - test_devices: MediumPhone.arm,30,en,portrait - environment_variables: additionalTestOutputDir=/sdcard/Android/media /com.hoge/ - directories_to_pull: /sdcard/Android/media/com.hoge/ - download_test_results: “true" • environment_variables: additionalTestOutputDir は前述のス クリーンショット保存時エラー回避で取 得したパスを入れる • directories_to_pullは、テスト完了後に デバイスのストレージからダウンロード されるパスになる • download_test_resultsは、false に設 定するとダッシュボードにのみダウン ロードされるようになる
04 実装例2(bitrise.ymlのファイルコピー部分抜粋) ©NewsPicks Inc. All Rights Reserved. 以下スクリプトをbitrise.ymlに追記することでテスト端末から CIのローカルに取り出します。 (取り出し時
ファイルをreg-suitのためにリネームします ) ${VDTESTING_DOWNLOADED_FILES_DIR}はBitriseでVirtualDeviceTesting実行時| sed -r "s/($IMAGE_PREFIX)(screenshottest[_a-z0-9]+)\.png/mv & \2.png/g" | bash ファイルが一次保存される場所を示した環境変数です $SAVED_ACTUAL_DIRは実行環境ローカル保存パスが入る $IMAGE_PREFIXは端末内保存パスが入 る(oriole-30-en-portrait_artifacts/sdcard/Android/media/com.hoge/) $ mv ${VDTESTING_DOWNLOADED_FILES_DIR}/screenshottest_*.png ./${SAVED_ACTUAL_DIR}/ $ cd ${SAVED_ACTUAL_DIR} $ ls | sed -r "s/($IMAGE_PREFIX)(screenshottest[_a-z0-9]+)\.png/mv & \2.png/g" | bash
04 実装例3(bitrise.ymlのreg-suit実行部分抜粋) ©NewsPicks Inc. All Rights Reserved. reg-suitで画像比較検証を行います。
API28以下もAPI29以上も、予めGoogle Cloud Storageに置いてある正解データ とローカルに移動してきたスクショを比較 検証します。 テストフロー④と⑤を実行します。 Bitriseで対話式のプラグインインストール を何も考えず行うとFailしていたため以下 のように echo N | を用いて回避する必 要がありました。 npm install -g reg-suit npm install # Pluginのインストール npm i reg-notify-slack-plugin -D echo N | reg-suit prepare -p notify-slack npm i reg-publish-gcs-plugin -D echo N | reg-suit prepare -p publish-gcs npm i reg-simple-keygen-plugin -D echo N | reg-suit prepare -p simple-keygen # 実行 reg-suit run
04 まとめ ©NewsPicks Inc. All Rights Reserved. AndroidのOSが9から10になったことでストレージまわりの権限が厳しくなりました。
これにより、巷にある方法ではうまく VRTができませんでしたが Bitriseで指定しているFirebaseのパラメータについては、 公式ドキュメントも見当たらず実ソースから読み解くことでやりたいことが実現できました