使用 Espresso 设备 API 测试屏幕配置更改

当设备发生常见的配置更改(例如旋转和屏幕展开)时,使用 Espresso 设备 API 测试您的应用。Espresso 设备 API 允许您在虚拟设备上模拟这些配置更改并同步执行您的测试,因此一次只执行一个 UI 操作或断言,并且您的测试结果更可靠。如果您不熟悉使用 Espresso 编写 UI 测试,请参阅其 文档

要使用 Espresso 设备 API,您需要以下内容

  • Android Studio Iguana 或更高版本
  • Android Gradle 插件 8.3 或更高版本
  • Android 模拟器 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.permissions.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 Device 库导入到您的项目中。

    Kotlin

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

    Groovy

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

针对常见的配置更改进行测试。

Espresso Device API 提供了多种屏幕方向和可折叠状态,您可以使用它们来模拟设备配置更改。

针对屏幕旋转进行测试。

以下是如何测试设备屏幕旋转时应用发生变化的示例。

  1. 首先,为了获得一致的起始状态,请将设备设置为纵向模式。

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. 创建一个测试,在测试执行期间将设备设置为横向方向。

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        ...
      }
      
  3. 屏幕旋转后,检查 UI 是否按预期适应新的布局。

      @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").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. 要过渡到完全展开的状态,请调用 onDevice().setFlatMode()。检查应用的布局是否适应扩展的大小类。

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

指定测试所需的设备。

如果您正在运行一项在不可折叠设备上执行折叠操作的测试,则该测试可能会失败。要仅执行与正在运行的设备相关的测试,请使用 @RequiresDeviceMode 注解。测试运行程序会自动跳过在不支持正在测试的配置的设备上运行的测试。您可以将设备要求规则添加到每个测试或整个测试类中。

例如,要指定仅在支持展开到平坦配置的设备上运行测试,请将以下 @RequiresDeviceMode 代码添加到您的测试中。

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