รูปแบบทั่วไป

คุณสามารถทดสอบแอป 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() มีการส่งการลบล้าง เพื่อใช้เป็นพารามิเตอร์

ตัวอย่างเช่น โค้ดต่อไปนี้ใช้ ลบล้าง 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 ในบางแง่มุม การทดสอบ