ซิงค์ข้อมูลการทดสอบของคุณ

เขียนการทดสอบจะซิงค์กับ UI ของคุณโดยค่าเริ่มต้น เมื่อคุณเรียกใช้การยืนยันหรือการดำเนินการด้วย ComposeTestRule ระบบจะซิงค์การทดสอบล่วงหน้าและรอจนกว่าต้นไม้ UI จะหยุดทำงาน

โดยปกติแล้วคุณไม่จำเป็นต้องดำเนินการใดๆ อย่างไรก็ตาม โปรดทราบว่ามีบางกรณีที่ควรทราบ

เมื่อมีการซิงค์การทดสอบ แอป Compose จะเดินหน้าเวลาโดยใช้นาฬิกาเสมือน ซึ่งหมายความว่าการทดสอบการคอมโพสิชันจะไม่ทํางานแบบเรียลไทม์เพื่อให้ผ่านการตรวจสอบได้เร็วที่สุด

อย่างไรก็ตาม หากคุณไม่ได้ใช้วิธีการที่ซิงค์การทดสอบ ระบบจะไม่จัดเรียงใหม่และ UI จะดูเหมือนหยุดชั่วคราว

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

โปรดทราบว่าข้อกำหนดนี้มีผลกับลําดับชั้นการเขียนเท่านั้น และไม่มีผลกับส่วนที่เหลือของแอป

ปิดใช้การซิงค์อัตโนมัติ

เมื่อคุณเรียกการยืนยันหรือการดำเนินการผ่าน ComposeTestRule เช่น assertExists() การทดสอบจะซิงค์กับ UI ของ Compose ในบางกรณี คุณอาจต้องการหยุดการซิงค์นี้และควบคุมนาฬิกาด้วยตนเอง ตัวอย่างเช่น คุณควบคุมเวลาในการจับภาพหน้าจอของภาพเคลื่อนไหวที่ถูกต้องแม่นยำในจุดที่ UI ยังไม่ว่างได้ หากต้องการปิดใช้การซิงค์อัตโนมัติ ให้ตั้งค่าพร็อพเพอร์ตี้ autoAdvance ใน mainClock เป็น false

composeTestRule.mainClock.autoAdvance = false

โดยปกติแล้ว คุณจะต้องกรอกเวลาด้วยตนเอง คุณสามารถเลื่อนไปข้างหน้า 1 เฟรมได้โดยใช้ advanceTimeByFrame() หรือเลื่อนตามระยะเวลาที่ต้องการโดยใช้ advanceTimeBy()

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

ทรัพยากรที่ไม่ได้ใช้งาน

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

สร้างและลงทะเบียนทรัพยากรที่ไม่ได้ใช้งานเหล่านี้ในการทดสอบเพื่อให้ระบบพิจารณาเมื่อตัดสินใจว่าแอปที่ทดสอบไม่ว่างหรือไม่ได้ใช้งาน คุณไม่ต้องดำเนินการใดๆ เว้นแต่คุณต้องลงทะเบียนทรัพยากรที่ไม่มีการใช้งานเพิ่มเติม เช่น หากคุณเรียกใช้งานเบื้องหลังที่ไม่ได้ซิงค์กับ Espresso หรือ Compose

API นี้คล้ายกับ ทรัพยากรที่ไม่ได้ใช้งานของ Espresso มาก แต่จะระบุได้ว่ารายการทดสอบไม่ได้ใช้งานหรือใช้งานอยู่ ใช้กฎการทดสอบการเขียนเพื่อลงทะเบียนการใช้งาน IdlingResource

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

การซิงค์ด้วยตนเอง

ในบางกรณี คุณต้องซิงค์ UI ของเครื่องมือเขียนอีเมลกับส่วนอื่นๆ ของการทดสอบหรือแอปที่คุณทดสอบ

ฟังก์ชัน waitForIdle() จะรอให้คอมโพซิ่งไม่มีการใช้งาน แต่ฟังก์ชันนี้ขึ้นอยู่กับพร็อพเพอร์ตี้ autoAdvance ดังนี้

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

โปรดทราบว่าทั้ง 2 กรณี waitForIdle() จะรอผ่านดรอว์และเลย์เอาต์ที่รอดำเนินการด้วย

นอกจากนี้ คุณยังเดินหน้านาฬิกาจนกว่าจะมีเงื่อนไขบางอย่างตรงตามที่กำหนดได้ด้วย advanceTimeUntil()

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

โปรดทราบว่าเงื่อนไขที่ระบุควรตรวจสอบสถานะที่ได้รับผลกระทบจากนาฬิกานี้ (ใช้ได้กับสถานะ "เขียน" เท่านั้น)

รอเงื่อนไข

เงื่อนไขใดๆ ที่ขึ้นอยู่กับการทำงานภายนอก เช่น การโหลดข้อมูลหรือการวัดหรือวาดของ Android (นั่นคือ การวัดหรือวาดภายนอก Compose) ควรใช้แนวคิดทั่วไปมากขึ้น เช่น waitUntil()

composeTestRule.waitUntil(timeoutMs) { condition }

นอกจากนี้ คุณยังใช้ตัวช่วย waitUntil ต่อไปนี้ได้ด้วย

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

แหล่งข้อมูลเพิ่มเติม

  • ทดสอบแอปใน Android: หน้า Landing Page หลักสำหรับการทดสอบของ Android ให้มุมมองที่กว้างขึ้นเกี่ยวกับพื้นฐานและเทคนิคของการทดสอบ
  • หลักพื้นฐานของการทดสอบ: ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวคิดหลักเบื้องหลังการทดสอบแอป Android
  • การทดสอบในเครื่อง: คุณสามารถทำการทดสอบบางอย่างในเครื่องของคุณเอง
  • การทดสอบที่มีเครื่องมือ: แนวทางปฏิบัติที่ดีคือทำการทดสอบแบบมีเครื่องวัดด้วย กล่าวคือ การทดสอบที่ทํางานในอุปกรณ์โดยตรง
  • การรวมอย่างต่อเนื่อง: การรวมอย่างต่อเนื่องช่วยให้คุณผสานรวมการทดสอบเข้ากับไปป์ไลน์การนำส่งได้
  • ทดสอบขนาดหน้าจอต่างๆ: เนื่องจากผู้ใช้มีอุปกรณ์หลากหลายรุ่น คุณจึงควรทดสอบขนาดหน้าจอต่างๆ
  • Espresso: แม้ว่าจะมีไว้สำหรับ UI ที่อิงตามมุมมอง แต่ความรู้เกี่ยวกับ Espresso ยังคงมีประโยชน์สำหรับบางแง่มุมของการทดสอบ Compose