Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Google I:O 2023 Androidの自動テストアップデートまとめ / Google I:O 2023 Android Testing Update Recap

Google I:O 2023 Androidの自動テストアップデートまとめ / Google I:O 2023 Android Testing Update Recap

Shibuya.apk #42の発表資料です。
https://shibuya-apk.connpass.com/event/283427/

tkmnzm

May 26, 2023
Tweet

More Decks by tkmnzm

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 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
    を使う

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Scalable UI testing solutions
    Espresso Device API
    Gradle Managed Device

    Firebase Test Lab
    サポート
    スクリーンショットテスト

    View Slide

  13. 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"
    }
    }
    }

    View Slide

  14. 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
    }
    }
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. 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)

    View Slide

  23. 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)
    }
    }

    View Slide

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

    View Slide

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

    View Slide

  26. 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'

    View Slide

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

    View Slide

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

    View Slide

  29. 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()
    }
    }
    }

    View Slide

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

    ストの幅が広がる期待感がありました

    View Slide

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

    View Slide