使用 Espresso Device API 測試螢幕設定變更

當裝置發生常見的設定變更 (例如旋轉和展開螢幕) 時,請使用 Espresso 裝置 API 測試應用程式。建議使用 Espresso 裝置 API,搭配 Jetpack Compose 測試規則,模擬裝置層級的動作。如果您不熟悉如何編寫 Jetpack Compose 的 UI 測試,請參閱「測試 Compose 版面配置」一文。

Espresso 裝置 API 可讓您在虛擬裝置上模擬設定變更,並同步執行測試,因此一次只會發生一個 UI 動作或判斷,測試結果也更可靠。如果您不熟悉如何使用 Espresso 編寫 UI 測試,請參閱相關說明文件

如要使用 Espresso 裝置 API,您需要:

  • Android Studio Iguana 以上版本
  • Android Gradle 外掛程式 8.3 以上版本
  • Android Emulator 33.1.10 以上版本
  • 搭載 API 級別 24 以上版本的 Android 虛擬裝置

設定 Espresso 裝置 API 專案

如要設定專案,使其支援 Espresso 裝置 API,請按照下列步驟操作:

  1. 如要讓測試將指令傳送至測試裝置,請在 androidTest 來源集的資訊清單檔案中,加入 INTERNETACCESS_NETWORK_STATE 權限:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  2. gradle.properties 檔案中啟用 enableEmulatorControl 實驗旗標:

      android.experimental.androidTest.enableEmulatorControl=true
    
  3. 在模組層級的建構指令碼中啟用 emulatorControl 選項:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. 在模組層級的建構指令碼中,將 Espresso 裝置程式庫匯入專案:

    Kotlin

    dependencies {
      androidTestImplementation("androidx.test.espresso:espresso-device:1.0.1")
    }

    Groovy

    dependencies {
      androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.1'
    }

針對常見的設定變更進行測試

Espresso 裝置 API 提供多種螢幕方向和摺疊式裝置狀態,可用於模擬裝置設定變更。下列範例說明如何觸發這些裝置狀態,並使用 Compose 測試規則驗證產生的 UI 變更。

針對螢幕旋轉進行測試

以下範例說明如何測試裝置螢幕旋轉時,應用程式的行為:

  1. 首先,請定義 Compose 測試規則,並將裝置設為一致的起始狀態 (例如直向模式):

    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)
    }
    
  2. 建立測試,在測試執行期間將裝置設為橫向:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. 螢幕旋轉後,請使用 composeTestRule 檢查可組合函式是否如預期般適應新狀態。

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
      composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
    }
    

測試螢幕展開功能

以下範例說明如何測試應用程式在摺疊式裝置上展開螢幕時的行為:

  1. 首先,請呼叫 onDevice().setClosedMode(),測試裝置處於摺疊狀態時的行為。請確認可組合函式是否能配合緊湊型螢幕寬度調整。

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
      composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
      ...
    }
    
  2. 如要轉換至完全展開狀態,請呼叫 onDevice().setFlatMode()。確認可組合函式是否會配合展開的大小類別調整。

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      ...
      onDevice().setFlatMode()
      composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
      composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
    }
    

指定測試所需的裝置

如果您在非摺疊式裝置上執行會執行摺疊動作的測試,測試可能會失敗。如要只執行與執行裝置相關的測試,請使用 @RequiresDeviceMode 註解。測試執行器會自動略過在不支援受測設定的裝置上執行測試。您可以為每個測試或整個測試類別新增裝置規定規則。

舉例來說,如要指定測試只能在支援展開至平坦設定的裝置上執行,請在測試中新增下列 @RequiresDeviceMode 程式碼:

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}