Slide 1

Slide 1 text

Google I/O 2023 Android の自動テスト アップデートまとめ Shibuya.apk #42 Nozomi Takuma

Slide 2

Slide 2 text

自己紹介 Nozomi Takuma 株式会社ディー・エヌ・エー SWET グループ Android とテストが好き

Slide 3

Slide 3 text

Google I/O 2023 Android のテスト関連セッシ ョン Scalable UI testing solutions How to test across all screen sizes

Slide 4

Slide 4 text

Scalable UI testing solutions Espresso Device API Gradle Managed Device のFirebase Test Lab サポート スクリーンショットテスト

Slide 5

Slide 5 text

How to test across all screen sizes 様々な画面サイズに対応するためにテストするべきこと 手動でのテストで使えるツール Large screen emulators & Resizable emulators デバイスミラーリング Multi Previews for Compose 自動テスト 様々な画面サイズのテストで使えるAPI window-testing, StateRestorationTester, Test Harness

Slide 6

Slide 6 text

Scalable UI testing solutions Espresso Device API Gradle Managerd Device のFirebase Test Lab サポート スクリーンショットテスト

Slide 7

Slide 7 text

Espresso Device API https://developer.android.com/studio/preview/features/#espresso- device-api デバイスの回転や折りたたみデバイスの開閉などのConfiguration change が発生した時のテストができる 同期的に実行されるので、Configuration change を待ち合わせるた めのsleep が不要 androidx.test.espresso:espresso-device

Slide 8

Slide 8 text

Espresso Device API を使用するのに必要な環 境 Android Studio Hedgehog Canary 2+ Android Gradle 8.2+ Android エミュレータ 33.1.10+ API レベル 24 以上のエミュレーター 実機はPixel Fold 、Pixel Tablet のみ対応 持っていないけど実機使いたい場合はFirebase Test Lab を使う

Slide 9

Slide 9 text

画面回転のテスト // テスト起動時の初期状態を縦向きに設定する @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @Test fun testRotation() { // 横向きにする onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) // Espresso やComposeTestRule を使って状態をアサートする // 同期してくれるのでsleep がいらない composeTestRule.onNodeWithTag("Agree Button").assertIsDisplayed() }

Slide 10

Slide 10 text

Foldable 端末のテスト @Test fun testFoldable() { // 折り畳んだ状態にする onDevice().setClosedMode() // 完全に開かれた状態にする onDevice().setFlatMode() }

Slide 11

Slide 11 text

テストを実行するデバイスの指定 Foldable 端末用のテストを、Folable 端末ではないデバイスで実行しな いようにする @Test @RequiresDeviceMode(mode = FLAT) fun test() { ... }

Slide 12

Slide 12 text

Scalable UI testing solutions Espresso Device API Gradle Managed Device の Firebase Test Lab サポート スクリーンショットテスト

Slide 13

Slide 13 text

Gradle Managed Device https://developer.android.com/studio/test/gradle-managed-devices build.gradle にテストを実行するエミュレータの構成を定義すると、 AVD 作成からテスト実行までGradle が自動でやってくれる managedDevices { devices { pixel2api30 (com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 2" apiLevel = 30 systemImageSource = "aosp" } } }

Slide 14

Slide 14 text

Gradle Managed Device の Firebase Test Lab サ ポート https://developer.android.com/studio/preview/features/#ftl-gmd GMD でFirebase Test Lab のデバイスが扱えるように firebaseTestLab { managedDevices { create("ftlDevice") { device = "Pixel3" apiLevel = 30 } } }

Slide 15

Slide 15 text

Scalable UI testing solutions Espresso Device API Gradle Managed Device のFirebase Test Lab サポート スクリーンショットテスト

Slide 16

Slide 16 text

スクリーンショットテスト AGP8.2 に、Local Test テストでCompose のプレビューのスクリーン ショットテストを実行できる機能を追加予定 リファレンスの画像の保存と、リファレンス画像と現在の画像を比 較するVisual Regression テストを実行するタスクが追加される Experimental なのでpreview のリリースノートを見てね

Slide 17

Slide 17 text

スクリーンショットテスト使い方 ( 予定 ) src/screenshotTest のソースセットを追加し、テストしたい Compose のPreview のコードを置く ./gradlew debugScreenshotTest –record-reference-images でリファ レンス画像の作成 ./gradlew debugScreenshotTest でVisual Regression テストの実行

Slide 18

Slide 18 text

Scalable UI testing solutions Espresso Device API Gradle Managed Device のFirebase Test Lab サポート スクリーンショットテスト

Slide 19

Slide 19 text

How to test across all screen sizes 様々な画面サイズに対応するためにテストするべきこと 手動でのテストで使えるツール Large screen emulators & Resizable emulators デバイスミラーリング Multi Previews for Compose 自動テスト 様々な画面サイズのテストで使えるAPI window-testing, StateRestorationTester, Test Harness

Slide 20

Slide 20 text

How to test across all screen sizes 様々な画面サイズに対応するためにテストするべきこと 手動でのテストで使えるツール Large screen emulators & Resizable emulators デバイスミラーリング Multi Previews for Compose 自動テスト 様々な画面サイズのテストで使えるAPI window-testing, StateRestorationTester, Test Harness

Slide 21

Slide 21 text

window-testing Jetpack Window Manager のテストライブラリ WindowLayoutInfoPublisherRule でFoldable 端末の折りたたみ状態 をエミュレート 使い方を学べるCodelab https://developer.android.com/codelabs/android-window- manager-dual-screen-foldables

Slide 22

Slide 22 text

WindowLayoutInfoPublisherRule セットアップ androidTestImplementation "androidx.window:window-testing:$windowmanager_version" @get:Rule(order = 0) val publisherRule = WindowLayoutInfoPublisherRule() @get:Rule(order = 1) val activityRule = ActivityScenarioRule(MainActivity::class.java)

Slide 23

Slide 23 text

WindowLayoutInfoPublisherRule @Test fun testFoldingFeature() { activityRule.scenario.onActivity { activity -> // 折りたたみの状態を任意の設定にして上書きする val hinge = FoldingFeature( activity = activity, state = FLAT, orientation = VERTICAL, size = 2 ) val expected = TestWindowLayoutInfo(listOf(hinge)) publisherRule.overrideWindowLayoutInfo(expected) } }

Slide 24

Slide 24 text

val hinge = FoldingFeature( activity = activity, state = FLAT, orientation = VERTICAL, size = 2 )

Slide 25

Slide 25 text

val hinge = FoldingFeature( activity = activity, state = FLAT, orientation = HORIZONTAL, size = 2 )

Slide 26

Slide 26 text

StateRestorationTester Compose のConfiguration Change 時の振る舞いをテストできる 使い方を学べるCodelab https://developer.android.com/codelabs/basic-android-kotlin- compose-adaptive-content-for-large-screens セットアップ implementation platform('androidx.compose:compose-bom:2023.01.00') androidTestImplementation 'androidx.compose.ui:ui-test-junit4'

Slide 27

Slide 27 text

StateRestorationTester @get:Rule val composeTestRule = createAndroidComposeRule() @Test fun stateRestoreTest() { val stateRestorationTester = StateRestorationTester(composeTestRule) stateRestorationTester.setContent { MyConmponent() } // 再生成された状態をエミュレート stateRestorationTester.emulateSavedInstanceStateRestore() // assert }

Slide 28

Slide 28 text

Test Harness Compose 用のテストライブラリ(accompanist) ロケール、フォント サイズ、画面サイズに任意のものを指定して Compose のテストをすることができる セットアップ implementation "com.google.accompanist:accompanist-testharness:"

Slide 29

Slide 29 text

Test Harness @Test fun test() { composeTestRule.setContent { // TestHarness でテストしたいComposable Function を囲む TestHarness( size = DpSize(800.dp, 1000.dp), fontScale = 1.5f, locales = LocaleListCompat.getDefault(), layoutDirection = LayoutDirection.Ltr, ) { MyConmponent() } } }

Slide 30

Slide 30 text

まとめ Google I/O 2023 Android のテスト関連セッション Scalable UI testing solutions How to test across all screen sizes Pixel Fold やPixel Tablet の登場に合わせて、様々なデバイスに対応 させるためのUI テストの手段が紹介されていた Local Test でのスクリーンショットテストと組み合わせたり、UI テ ストの幅が広がる期待感がありました

Slide 31

Slide 31 text

宣伝 一緒に働いてくれるメンバーを募集中です! https://engineering.dena.com/team/quality/swet/