คุณสามารถทดสอบแอป Compose ด้วยวิธีการและรูปแบบที่รู้จักกันดี
ทดสอบแยกต่างหาก
ComposeTestRule
ให้คุณเริ่มกิจกรรมแสดง Composable ดังนี้
แอปพลิเคชันแบบเต็มของคุณ หน้าจอเดียว หรือองค์ประกอบขนาดเล็ก นอกจากนี้ยังเป็น
วิธีตรวจสอบว่า Composable ได้รับการห่อหุ้มอย่างถูกต้องและใช้งานได้
ได้อย่างอิสระ ซึ่งช่วยให้ทดสอบ UI ได้ง่ายและตรงจุดยิ่งขึ้น
แต่ไม่ได้หมายความว่าคุณควรสร้างเฉพาะการทดสอบ UI ระดับหน่วย ขอบเขตของการทดสอบ UI ส่วนประกอบขนาดใหญ่ของ UI ก็มีความสำคัญมากเช่นกัน
เข้าถึงกิจกรรมและแหล่งข้อมูลหลังจากที่ตั้งค่าเนื้อหาของคุณเอง
บ่อยครั้งที่คุณจำเป็นต้องตั้งค่าเนื้อหาภายใต้การทดสอบโดยใช้
composeTestRule.setContent
และคุณยังต้องเข้าถึงทรัพยากรกิจกรรมสำหรับ
ตัวอย่างเพื่อยืนยันว่าข้อความที่แสดงตรงกับแหล่งข้อมูลสตริง อย่างไรก็ตาม คุณ
ไม่สามารถเรียกใช้ setContent
ในกฎที่สร้างด้วย createAndroidComposeRule()
หาก
มีกิจกรรมนั้นอยู่แล้ว
รูปแบบที่พบบ่อยในการบรรลุเป้าหมายนี้คือการสร้าง AndroidComposeTestRule
โดยใช้
กิจกรรมที่ว่างเปล่า เช่น ComponentActivity
class MyComposeTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@Test
fun myTest() {
// Start the app
composeTestRule.setContent {
MyAppTheme {
MainScreen(uiState = exampleUiState, /*...*/)
}
}
val continueLabel = composeTestRule.activity.getString(R.string.next)
composeTestRule.onNodeWithText(continueLabel).performClick()
}
}
โปรดทราบว่าคุณต้องเพิ่ม ComponentActivity
ลงใน
AndroidManifest.xml
เปิดใช้โดยเพิ่มทรัพยากร Dependency นี้ไปยัง
โมดูล:
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
พร็อพเพอร์ตี้ความหมายที่กำหนดเอง
คุณสร้างคุณสมบัติอรรถศาสตร์ที่กำหนดเองเพื่อแสดงข้อมูลในการทดสอบได้
ซึ่งทำได้โดยการกำหนด SemanticsPropertyKey
ใหม่และทำให้พร้อมใช้งานโดยใช้
SemanticsPropertyReceiver
// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey
แล้วใช้พร็อพเพอร์ตี้นั้นในตัวแก้ไข semantics
val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
modifier = Modifier.semantics { pickedDate = datePickerValue }
)
จากการทดสอบ ให้ใช้ SemanticsMatcher.expectValue
เพื่อยืนยันค่าของ
พร็อพเพอร์ตี้:
composeTestRule
.onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
.assertExists()
ยืนยันการกู้คืนสถานะ
ตรวจสอบว่าสถานะขององค์ประกอบการเขียนได้รับการคืนค่าอย่างถูกต้องเมื่อ
กิจกรรมหรือกระบวนการใหม่ขึ้น ดําเนินการตรวจสอบดังกล่าวโดยไม่ต้องอาศัย
กิจกรรมนันทนาการร่วมกับชั้นเรียน StateRestorationTester
ชั้นเรียนนี้ให้คุณจำลองการสร้าง Composable ขึ้นมาจำลอง โดยเฉพาะอย่างยิ่ง
มีประโยชน์ในการตรวจสอบการติดตั้งใช้งาน rememberSaveable
class MyStateRestorationTests {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun onRecreation_stateIsRestored() {
val restorationTester = StateRestorationTester(composeTestRule)
restorationTester.setContent { MainScreen() }
// TODO: Run actions that modify the state
// Trigger a recreation
restorationTester.emulateSavedInstanceStateRestore()
// TODO: Verify that state has been correctly restored.
}
}
ทดสอบการกำหนดค่าอุปกรณ์แบบต่างๆ
แอป Android ต้องปรับให้เข้ากับสภาพที่เปลี่ยนแปลงมากมาย เช่น ขนาดหน้าต่าง ภาษา
ขนาดแบบอักษร ธีมสีเข้มและสีอ่อน และอื่นๆ ภาวะเหล่านี้ส่วนใหญ่
ได้มาจากค่าระดับอุปกรณ์ที่ผู้ใช้ควบคุมและเปิดเผยด้วย
อินสแตนซ์ปัจจุบันของ Configuration
การทดสอบการกำหนดค่าต่างๆ
ในการทดสอบโดยตรง จึงทำได้ยากเนื่องจากการทดสอบต้องกำหนดค่าระดับอุปกรณ์
พร็อพเพอร์ตี้
DeviceConfigurationOverride
เป็น API สำหรับการทดสอบเท่านั้นซึ่งให้คุณจำลอง
การกำหนดค่าอุปกรณ์ต่างๆ ในรูปแบบที่แปลแล้วสำหรับเนื้อหา @Composable
อยู่ระหว่างทดสอบ
ออบเจ็กต์ร่วมของ DeviceConfigurationOverride
มีรายการต่อไปนี้
ของส่วนขยาย ซึ่งจะลบล้างพร็อพเพอร์ตี้การกำหนดค่าระดับอุปกรณ์
DeviceConfigurationOverride.DarkMode()
: ลบล้างระบบให้เป็นโหมดมืด ธีม หรือธีมสว่างDeviceConfigurationOverride.FontScale()
: ลบล้างแบบอักษรของระบบDeviceConfigurationOverride.FontWeightAdjustment()
: ลบล้างพารามิเตอร์ การปรับน้ำหนักแบบอักษรของระบบDeviceConfigurationOverride.ForcedSize()
: บังคับจำนวนที่เจาะจง พื้นที่เท่าใดก็ได้ไม่ว่าอุปกรณ์จะมีขนาดเท่าใดก็ตามDeviceConfigurationOverride.LayoutDirection()
: ลบล้างเลย์เอาต์ ทิศทาง (จากซ้ายไปขวาหรือขวาไปซ้าย)DeviceConfigurationOverride.Locales()
: ลบล้างภาษาDeviceConfigurationOverride.RoundScreen()
: ลบล้างหากหน้าจอ คือกลม
หากต้องการใช้การลบล้างเฉพาะ ให้รวมเนื้อหาไว้ภายใต้การทดสอบในการเรียกฟังก์ชัน
ฟังก์ชันระดับบนสุดของ DeviceConfigurationOverride()
มีการส่งการลบล้าง
เพื่อใช้เป็นพารามิเตอร์
ตัวอย่างเช่น โค้ดต่อไปนี้ใช้
ลบล้าง DeviceConfigurationOverride.ForcedSize()
เพื่อเปลี่ยนความหนาแน่น
ในเครื่อง โดยบังคับให้ MyScreen
Composable แสดงผลในภูมิทัศน์ขนาดใหญ่
แม้ว่าอุปกรณ์ที่ทดสอบจะไม่รองรับหน้าต่างนั้นก็ตาม
ปรับขนาดโดยตรง:
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp)) ) { MyScreen() // will be rendered in the space for 1280dp by 800dp without clipping } }
หากต้องการใช้การลบล้างหลายรายการร่วมกัน ให้ใช้
DeviceConfigurationOverride.then()
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.FontScale(1.5f) then DeviceConfigurationOverride.FontWeightAdjustment(200) ) { Text(text = "text with increased scale and weight") } }
แหล่งข้อมูลเพิ่มเติม
- ทดสอบแอปใน Android: การทดสอบหลักของ Android หน้า Landing Page ให้มุมมองที่กว้างขึ้นเกี่ยวกับพื้นฐานและเทคนิคของการทดสอบ
- พื้นฐานการทดสอบ: ดูข้อมูลเพิ่มเติม เกี่ยวกับแนวคิดหลักเบื้องหลังการทดสอบแอป Android
- การทดสอบในเครื่อง: คุณทำการทดสอบได้บางรายการ ภายในเวิร์กสเตชันของคุณเอง
- การทดสอบแบบมีเครื่องวัด: ดี เพื่อทำการทดสอบแบบมีเครื่องวัดด้วย กล่าวคือ การทดสอบที่ทำงานโดยตรง ในอุปกรณ์
- การผสานรวมอย่างต่อเนื่อง: การผสานรวมอย่างต่อเนื่องช่วยให้คุณผสานรวมการทดสอบเข้ากับการติดตั้งใช้งานได้ ไปป์ไลน์
- ทดสอบหน้าจอขนาดต่างๆ: ด้วย มีอุปกรณ์มากมายที่ผู้ใช้มี คุณควรทดสอบสำหรับหน้าจอแบบต่างๆ ขนาดต่างๆ
- Espresso: เหมาะสำหรับข้อมูลในมุมมอง UI, ความรู้เกี่ยวกับ Espresso ยังมีประโยชน์สำหรับ Compose ในบางแง่มุม การทดสอบ