Kiểm thử dựa trên các thay đổi về cấu hình màn hình bằng Espresso Device API

Sử dụng Espresso Device API để kiểm thử ứng dụng khi thiết bị trải qua các thay đổi thường gặp về cấu hình, chẳng hạn như xoay và mở màn hình. Espresso Device API là công cụ được đề xuất để mô phỏng các thao tác ở cấp thiết bị cùng với các quy tắc kiểm thử Jetpack Compose. Nếu bạn mới bắt đầu viết các bài kiểm thử giao diện người dùng cho Jetpack Compose, hãy xem bài viết Kiểm thử bố cục Compose.

Espresso Device API cho phép bạn mô phỏng các thay đổi về cấu hình trên một thiết bị ảo và thực thi các bài kiểm thử một cách đồng bộ, do đó, chỉ có một thao tác hoặc câu nhận định trên giao diện người dùng xảy ra tại một thời điểm và kết quả kiểm thử của bạn sẽ đáng tin cậy hơn. Nếu bạn mới bắt đầu viết các chương trình kiểm thử giao diện người dùng bằng Espresso, hãy xem tài liệu của Espresso.

Để sử dụng Espresso Device API, bạn cần có những điều kiện sau:

  • Android Studio Iguana trở lên
  • Trình bổ trợ Android cho Gradle 8.3 trở lên
  • Trình mô phỏng Android 33.1.10 trở lên
  • Thiết bị ảo Android chạy cấp độ API 24 trở lên

Thiết lập dự án cho Espresso Device API

Để thiết lập dự án sao cho dự án hỗ trợ Espresso Device API, hãy làm như sau:

  1. Để cho phép kiểm thử truyền các lệnh đến thiết bị thử nghiệm, hãy thêm các quyền INTERNETACCESS_NETWORK_STATE vào tệp kê khai trong nhóm tài nguyên androidTest:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  2. Bật cờ thử nghiệm enableEmulatorControl trong tệp gradle.properties:

      android.experimental.androidTest.enableEmulatorControl=true
    
  3. Bật lựa chọn emulatorControl trong tập lệnh bản dựng cấp mô-đun:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. Trong tập lệnh bản dựng cấp mô-đun, hãy nhập thư viện Espresso Device vào dự án của bạn:

    Kotlin

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

    Groovy

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

Kiểm thử đối với các thay đổi thường gặp về cấu hình

Espresso Device API có nhiều trạng thái hướng màn hình và trạng thái có thể gập lại mà bạn có thể dùng để mô phỏng các thay đổi về cấu hình thiết bị. Các ví dụ sau đây cho thấy cách kích hoạt các trạng thái thiết bị này và xác minh các thay đổi về giao diện người dùng thu được bằng cách sử dụng các quy tắc kiểm thử Compose.

Kiểm thử dựa trên tính năng xoay màn hình

Dưới đây là ví dụ về cách kiểm thử những gì xảy ra với ứng dụng của bạn khi màn hình thiết bị xoay:

  1. Trước tiên, hãy xác định quy tắc kiểm thử Compose và đặt thiết bị ở trạng thái bắt đầu nhất quán (chẳng hạn như chế độ dọc):

    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. Tạo một chương trình kiểm thử đặt thiết bị ở hướng ngang trong quá trình thực thi kiểm thử:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. Sau khi màn hình xoay, hãy dùng composeTestRule để kiểm tra xem các composable có thích ứng với state mới như dự kiến hay không.

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

Kiểm thử khi màn hình mở ra

Dưới đây là ví dụ về cách kiểm thử điều gì sẽ xảy ra với ứng dụng của bạn nếu ứng dụng đó nằm trên một thiết bị có thể gập lại và màn hình mở ra:

  1. Trước tiên, hãy kiểm thử khi thiết bị ở trạng thái gập bằng cách gọi onDevice().setClosedMode(). Đảm bảo rằng các thành phần kết hợp của bạn thích ứng với chiều rộng màn hình nhỏ gọn.

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
      composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
      ...
    }
    
  2. Để chuyển sang trạng thái mở hoàn toàn, hãy gọi onDevice().setFlatMode(). Kiểm tra để đảm bảo các thành phần kết hợp thích ứng với lớp kích thước mở rộng.

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

Chỉ định những thiết bị mà các kiểm thử của bạn cần

Nếu bạn đang chạy một quy trình kiểm thử thực hiện các thao tác gập trên một thiết bị không gập được, thì quy trình kiểm thử đó có thể sẽ không thành công. Để chỉ thực thi những kiểm thử có liên quan đến thiết bị đang chạy, hãy dùng chú giải @RequiresDeviceMode. Trình chạy kiểm thử sẽ tự động bỏ qua việc chạy kiểm thử trên những thiết bị không hỗ trợ cấu hình đang được kiểm thử. Bạn có thể thêm quy tắc yêu cầu về thiết bị vào từng bài kiểm thử hoặc toàn bộ lớp kiểm thử.

Ví dụ: để chỉ định rằng một lượt kiểm thử chỉ được chạy trên những thiết bị hỗ trợ mở ra thành cấu hình phẳng, hãy thêm mã @RequiresDeviceMode sau vào lượt kiểm thử:

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