ทดสอบการเปลี่ยนแปลงการกำหนดค่าหน้าจอด้วย Espresso Device API

ใช้ Espresso Device API เพื่อทดสอบแอปเมื่ออุปกรณ์มีการเปลี่ยนแปลงการกำหนดค่าทั่วไป เช่น การหมุนและการกางหน้าจอ Espresso Device API ช่วยให้คุณจําลองการเปลี่ยนแปลงการกําหนดค่าเหล่านี้ในอุปกรณ์เสมือนจริง และทําการทดสอบแบบซิงค์กันเพื่อให้การดําเนินการหรือการตรวจสอบ UI เกิดขึ้นครั้งละ 1 ครั้งเท่านั้น และผลลัพธ์การทดสอบจะน่าเชื่อถือมากขึ้น หากเพิ่งเริ่มเขียนการทดสอบ UI ด้วย Espresso โปรดดูเอกสารประกอบ

หากต้องการใช้ Espresso Device API คุณต้องมีสิ่งต่อไปนี้

  • Android Studio Iguana ขึ้นไป
  • ปลั๊กอิน Android Gradle 8.3 ขึ้นไป
  • Android Emulator 33.1.10 ขึ้นไป
  • อุปกรณ์เสมือน Android ที่ใช้ API ระดับ 24 ขึ้นไป

ตั้งค่าโปรเจ็กต์สำหรับ Espresso Device API

หากต้องการตั้งค่าโปรเจ็กต์ให้รองรับ Espresso Device API ให้ทําดังนี้

  1. หากต้องการให้การทดสอบส่งคำสั่งไปยังอุปกรณ์ทดสอบ ให้เพิ่มสิทธิ์ INTERNET และ ACCESS_NETWORK_STATE ลงในไฟล์ Manifest ในชุดแหล่งที่มา androidTest ดังนี้

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
  2. เปิดใช้ Flag ทดลอง enableEmulatorControl ในไฟล์ gradle.properties

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