Gunakan Espresso Device API untuk menguji aplikasi Anda saat perangkat mengalami perubahan konfigurasi umum, seperti rotasi dan pembukaan layar. Espresso Device API adalah alat yang direkomendasikan untuk melakukan tindakan tingkat perangkat bersama dengan aturan pengujian Jetpack Compose Anda. Jika Anda baru menulis pengujian UI untuk Jetpack Compose, lihat Menguji tata letak Compose Anda.
Espresso Device API memungkinkan Anda memicu perubahan konfigurasi pada perangkat virtual dan menjalankan pengujian secara sinkron, sehingga hanya satu tindakan atau pernyataan UI yang terjadi pada satu waktu dan hasil pengujian Anda lebih andal. Jika Anda baru menulis pengujian UI dengan Espresso, lihat dokumentasinya.
Untuk menggunakan Espresso Device API, Anda memerlukan hal berikut:
- Android Studio Iguana atau yang lebih baru
- Plugin Android Gradle 8.3 atau yang lebih baru
- Android Emulator 33.1.10 atau yang lebih baru
- Perangkat virtual Android yang menjalankan level API 24 atau yang lebih baru
Menyiapkan project untuk Espresso Device API
Untuk menyiapkan project agar mendukung Espresso Device API, lakukan hal berikut:
Agar pengujian dapat meneruskan perintah ke perangkat pengujian, tambahkan izin jaringan yang diperlukan ke file manifes di set sumber
androidTest:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Jika pengujian Anda menargetkan Android 17 (level API 37) atau yang lebih baru, Anda juga harus mendeklarasikan izin
ACCESS_LOCAL_NETWORK:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />Aktifkan flag eksperimental
enableEmulatorControldi filegradle.properties:android.experimental.androidTest.enableEmulatorControl=trueAktifkan opsi
emulatorControldi skrip build level modul:Kotlin
testOptions { emulatorControl { enable = true } }
Groovy
testOptions { emulatorControl { enable = true } }
Dalam skrip build level modul, impor library Espresso Device ke project Anda:
Kotlin
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0") }
Groovy
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
Menguji perubahan konfigurasi umum
Espresso Device API memiliki beberapa orientasi layar dan status foldable yang dapat Anda gunakan untuk memicu perubahan konfigurasi perangkat. Contoh berikut menunjukkan cara memicu status perangkat ini dan memverifikasi perubahan UI yang dihasilkan menggunakan aturan pengujian Compose.
Menguji rotasi layar
Untuk menguji rotasi layar, Anda dapat menggunakan class ScreenOrientationRule untuk menentukan orientasi perangkat selama pengujian.
Berikut adalah contoh cara menguji apa yang terjadi pada aplikasi Anda saat layar perangkat berputar:
Pertama, tentukan aturan pengujian Compose dan gunakan class
ScreenOrientationRuleuntuk menetapkan perangkat ke status awal yang konsisten (seperti mode potret):import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertDoesNotExist import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.device.EspressoDevice.onDevice import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule import org.junit.Rule import org.junit.Test class MyConfigurationTest { // 1. Define the Compose test rule @get:Rule val composeTestRule = createComposeRule() // 2. Define the Espresso Device rule for a consistent starting state @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) }Jika pengujian Anda menargetkan Android 17 (level API 37) atau yang lebih baru, Espresso Device API memerlukan izin
ACCESS_LOCAL_NETWORK. Anda harus memastikan izin ini diberikan sebelum aturanScreenOrientationRuledijalankan. GunakanRuleChainJUnit untuk menjalankan aturanGrantPermissionRuleterlebih dahulu:import androidx.test.rule.GrantPermissionRule import org.junit.rules.RuleChain class MyConfigurationTest { val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK) val composeTestRule = createComposeRule() val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @get:Rule val chain = RuleChain .outerRule(grantPermissionRule) .around(composeTestRule) .around(screenOrientationRule) }Buat pengujian yang menetapkan perangkat ke orientasi lanskap selama eksekusi pengujian:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }Setelah layar berputar, gunakan
composeTestRuleuntuk memeriksa apakah composable Anda beradaptasi dengan status baru seperti yang diharapkan.@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Menguji pembukaan layar
Berikut adalah contoh cara menguji apa yang terjadi pada aplikasi Anda jika aplikasi berada di perangkat foldable dan layar terbuka:
Pertama, uji dengan perangkat dalam status terlipat dengan memanggil
onDevice().setClosedMode(). Pastikan composable Anda beradaptasi dengan lebar layar ringkas.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }Untuk bertransisi ke status yang sepenuhnya terbuka, panggil
onDevice().setFlatMode(). Periksa apakah composable beradaptasi dengan class ukuran yang diperluas.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Menentukan perangkat yang diperlukan pengujian Anda
Jika Anda menjalankan pengujian yang melakukan tindakan pelipatan pada perangkat yang tidak foldable, pengujian kemungkinan akan gagal. Untuk hanya menjalankan pengujian yang relevan dengan perangkat yang sedang berjalan, gunakan anotasi @RequiresDeviceMode. Peluncur pengujian otomatis melewati pengujian yang berjalan di perangkat yang tidak mendukung konfigurasi yang sedang diuji. Anda dapat menambahkan aturan persyaratan perangkat ke setiap pengujian atau seluruh class pengujian.
Misalnya, untuk menentukan bahwa pengujian hanya boleh dijalankan di perangkat yang mendukung pembukaan ke konfigurasi datar, tambahkan kode @RequiresDeviceMode berikut ke pengujian Anda:
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}