ใช้ Espresso Device API เพื่อทดสอบแอปเมื่ออุปกรณ์พบการดำเนินการทั่วไป การเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนและการกางหน้าจอ กาแฟเอสเปรสโซ 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.permissions.ACCESS_NETWORK_STATE" />
เปิดใช้ Flag
enableEmulatorControl
เวอร์ชันทดลองใน ไฟล์gradle.properties
:android.experimental.androidTest.enableEmulatorControl=true
เปิดใช้ตัวเลือก
emulatorControl
ในบิลด์ระดับโมดูล สคริปต์:Kotlin
testOptions { emulatorControl { enable = true } }
ดึงดูด
testOptions { emulatorControl { enable = true } }
ในสคริปต์บิลด์ระดับโมดูล ให้นำเข้าไลบรารีอุปกรณ์ Espresso ลงในโปรเจ็กต์ของคุณ:
Kotlin
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.0.0-beta01") }
ดึงดูด
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.0-beta01' }
ทดสอบการเปลี่ยนแปลงการกำหนดค่าทั่วไป
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() {
...
}