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
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test_...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
MasatoHaruta
May 21, 2024
12
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test__1_.pdf
MasatoHaruta
May 21, 2024
More Decks by MasatoHaruta
See All by MasatoHaruta
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test.pdf
blurfour
0
86
CIを用いたAndroidのAPI29以上でのVisual_Regression_Test__2_.pdf
blurfour
0
24
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
300
WENDY [Excerpt]
tessaabrams
11
38k
Scaling GitHub
holman
464
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
The Language of Interfaces
destraynor
162
27k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
310
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
A better future with KSS
kneath
240
18k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
エンジニアに許された特別な時間の終わり
watany
108
250k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Transcript
00 自己紹介 ©NewsPicks Inc. All Rights Reserved. Masato Haruta
NewsPicks Androidエンジニア
CIを用いたAndroidのAPI29以上での Visual Regression Test Last updated:2024.05.21 NewsPicks Android Engineer /
Masato Haruta
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実行時 ファイルが一次保存される場所を示した環境変数です $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のパラメータについては、 公式ドキュメントも見当たらず実ソースから読み解くことでやりたいことが実現できました