ใช้ Espresso Device API เพื่อทดสอบแอปเมื่ออุปกรณ์มีการเปลี่ยนแปลงการกำหนดค่าทั่วไป เช่น การหมุนและการกางหน้าจอ Espresso Device API ช่วยให้คุณจำลองการเปลี่ยนแปลงการกำหนดค่าเหล่านี้ในอุปกรณ์เสมือนจริงและดำเนินการทดสอบแบบซิงโครนัส ดังนั้นการดำเนินการหรือการยืนยัน UI จะเกิดขึ้นได้ครั้งละ 1 รายการเท่านั้น และผลการทดสอบจะมีความน่าเชื่อถือมากขึ้น หากคุณเพิ่งเริ่มเขียนการทดสอบ UI ด้วย Espresso โปรดดูเอกสารประกอบ
หากต้องการใช้ Espresso Device API คุณต้องมีสิ่งต่อไปนี้
- Android Studio Iguana ขึ้นไป
- ปลั๊กอิน Android Gradle เวอร์ชัน 8.3 ขึ้นไป
- โปรแกรมจำลองของ Android เวอร์ชัน 33.1.10 ขึ้นไป
- อุปกรณ์เสมือน Android ที่ใช้ API ระดับ 24 ขึ้นไป
ตั้งค่าโปรเจ็กต์สำหรับ Espresso Device API
หากต้องการตั้งค่าโปรเจ็กต์ให้รองรับ Espresso Device API ให้ทำดังนี้
หากต้องการให้การทดสอบส่งคำสั่งไปยังอุปกรณ์ทดสอบได้ ให้เพิ่มสิทธิ์
INTERNETและACCESS_NETWORK_STATEลงในไฟล์ Manifest ในชุดซอร์สandroidTest<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
เปิดใช้แฟล็กทดลอง
enableEmulatorControlในไฟล์gradle.propertiesandroid.experimental.androidTest.enableEmulatorControl=true
เปิดใช้ตัวเลือก
emulatorControlในสคริปต์บิลด์ระดับโมดูลKotlin
testOptions { emulatorControl { enable = true } }
ดึงดูด
testOptions { emulatorControl { enable = true } }
ในสคริปต์บิลด์ระดับโมดูล ให้นำเข้าไลบรารี Espresso Device ไปยังโปรเจ็กต์
Kotlin
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.0.1") }
ดึงดูด
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.1' }
ทดสอบกับการเปลี่ยนแปลงการกำหนดค่าทั่วไป
Espresso Device API มีการวางแนวหน้าจอและสถานะพับได้หลายรายการที่คุณใช้จำลองการเปลี่ยนแปลงการกำหนดค่าอุปกรณ์ได้
ทดสอบกับการหมุนหน้าจอ
ตัวอย่างวิธีทดสอบสิ่งที่เกิดขึ้นกับแอปเมื่อหน้าจออุปกรณ์หมุน
ก่อนอื่น ให้ตั้งค่าอุปกรณ์เป็นโหมดแนวตั้งเพื่อให้สถานะเริ่มต้นสอดคล้องกัน
import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule ... @get:Rule val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
สร้างการทดสอบที่ตั้งค่าอุปกรณ์เป็นแนวนอนระหว่างการดำเนินการทดสอบ
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }
หลังจากหน้าจอหมุนแล้ว ให้ตรวจสอบว่า 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() }
ทดสอบกับการกางหน้าจอ
ตัวอย่างวิธีทดสอบสิ่งที่เกิดขึ้นกับแอปหากแอปอยู่ในอุปกรณ์พับได้และหน้าจอกางออก
ก่อนอื่น ให้ทดสอบโดยให้อุปกรณ์อยู่ในสถานะพับโดยเรียกใช้
onDevice().setClosedMode()ตรวจสอบว่าเลย์เอาต์ของแอป ปรับให้เข้ากับความกว้างหน้าจอขนาดกะทัดรัด@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist() ... }
หากต้องการเปลี่ยนไปใช้สถานะกางออกเต็มที่ ให้เรียกใช้
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() {
...
}