ทดสอบกิจกรรมของแอป

กิจกรรมทำหน้าที่เป็นคอนเทนเนอร์สำหรับการโต้ตอบของผู้ใช้ทุกครั้งภายในแอป ดังนั้น คุณจึงควรทดสอบลักษณะการทำงานของกิจกรรมในแอปในระหว่างเหตุการณ์ระดับอุปกรณ์ เช่น เหตุการณ์ต่อไปนี้

  • แอปอื่น เช่น แอปโทรศัพท์ของอุปกรณ์ ขัดจังหวะกิจกรรมของแอป
  • ระบบจะทำลายและสร้างกิจกรรมของคุณขึ้นมาใหม่
  • ผู้ใช้จะวางกิจกรรมของคุณในสภาพแวดล้อมการแสดงผลแบบใหม่ เช่น การแสดงภาพซ้อนภาพ (PIP) หรือหลายหน้าต่าง

โดยเฉพาะอย่างยิ่ง คุณต้องตรวจสอบว่ากิจกรรมทํางานอย่างถูกต้องเพื่อตอบสนองต่อเหตุการณ์ที่อธิบายไว้ในวงจรของกิจกรรม

คู่มือนี้อธิบายวิธีประเมินความสามารถของแอปในการรักษาความสมบูรณ์ของข้อมูล และประสบการณ์ของผู้ใช้ที่ดีเมื่อกิจกรรมของแอปเปลี่ยน ผ่านสถานะต่างๆ ในวงจรชีวิต

ขับเคลื่อนสถานะของกิจกรรม

แง่มุมที่สำคัญอย่างหนึ่งของการทดสอบกิจกรรมของแอปคือการวางกิจกรรมของแอปในสถานะที่เฉพาะเจาะจง หากต้องการกำหนดส่วน "given" ของการทดสอบ ให้ใช้อินสแตนซ์ของ ActivityScenario ซึ่งเป็นส่วนหนึ่งของไลบรารี AndroidX Test เมื่อใช้คลาสนี้ คุณจะ วางกิจกรรมในสถานะที่จำลองเหตุการณ์ระดับอุปกรณ์ได้

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

API นี้เหมาะอย่างยิ่งสำหรับการประเมินลักษณะการทำงานของกิจกรรมภายใต้การทดสอบเมื่อมีการทำลายหรือสร้างกิจกรรม ส่วนนี้จะแสดงกรณีการใช้งานที่พบบ่อยที่สุด ซึ่งเชื่อมโยงกับ API นี้

สร้างกิจกรรม

หากต้องการสร้างกิจกรรมภายใต้การทดสอบ ให้เพิ่มโค้ดที่แสดงในข้อมูลโค้ดต่อไปนี้

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

หลังจากสร้างกิจกรรมแล้ว ActivityScenario จะเปลี่ยนสถานะกิจกรรมเป็น RESUMED สถานะนี้บ่งบอกว่ากิจกรรมของคุณกำลังทำงานและ ผู้ใช้มองเห็นได้ ในสถานะนี้ คุณสามารถโต้ตอบกับองค์ประกอบของกิจกรรมViewได้โดยใช้การทดสอบ UI ของ Espresso

Google ขอแนะนำให้คุณโทรหา close ในกิจกรรมเมื่อการทดสอบ เสร็จสมบูรณ์ ซึ่งจะล้างทรัพยากรที่เชื่อมโยงและปรับปรุง ความเสถียรของการทดสอบ ActivityScenario จะใช้ Closeable เพื่อให้คุณ ใช้ส่วนขยาย use หรือ try-with-resources ในภาษาโปรแกรม Java เพื่อให้กิจกรรมปิดโดยอัตโนมัติ

หรือจะใช้ ActivityScenarioRule เพื่อเรียกใช้ ActivityScenario.launch โดยอัตโนมัติก่อนการทดสอบแต่ละครั้ง และ ActivityScenario.close เมื่อสิ้นสุดการทดสอบก็ได้ ตัวอย่างต่อไปนี้แสดงวิธีกำหนดกฎและรับอินสแตนซ์ของสถานการณ์จากกฎ

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

ขับเคลื่อนกิจกรรมไปสู่สถานะใหม่

หากต้องการเปลี่ยนสถานะกิจกรรมเป็นสถานะอื่น เช่น CREATED หรือ STARTED ให้เรียกใช้ moveToState() การดำเนินการนี้จำลองสถานการณ์ที่กิจกรรมของคุณ หยุดหรือหยุดชั่วคราวตามลำดับ เนื่องจากถูกขัดจังหวะโดยแอปอื่นหรือ การดำเนินการของระบบ

ตัวอย่างการใช้งาน moveToState() ปรากฏในข้อมูลโค้ดต่อไปนี้

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

กำหนดสถานะกิจกรรมปัจจุบัน

หากต้องการพิจารณาสถานะปัจจุบันของกิจกรรมที่อยู่ระหว่างการทดสอบ ให้รับค่าของฟิลด์ state ภายในออบเจ็กต์ ActivityScenario การตรวจสอบสถานะของกิจกรรมที่อยู่ระหว่างการทดสอบจะมีประโยชน์อย่างยิ่ง หากกิจกรรมเปลี่ยนเส้นทางไปยังกิจกรรมอื่นหรือสิ้นสุดด้วยตัวเอง ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

สร้างกิจกรรมใหม่

เมื่ออุปกรณ์มีทรัพยากรเหลือน้อย ระบบอาจทำลายกิจกรรม ซึ่งจะทำให้แอปต้องสร้างกิจกรรมนั้นใหม่เมื่อผู้ใช้กลับมาที่แอป หากต้องการจำลองเงื่อนไขเหล่านี้ ให้เรียกใช้ recreate()

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

คลาส ActivityScenario จะรักษาสถานะอินสแตนซ์ที่บันทึกไว้ของกิจกรรมและ ออบเจ็กต์ใดก็ตามที่มีคำอธิบายประกอบโดยใช้ @NonConfigurationInstance โดยออบเจ็กต์เหล่านี้จะโหลด ลงในอินสแตนซ์ใหม่ของกิจกรรมภายใต้การทดสอบ

เรียกผลลัพธ์ของกิจกรรม

หากต้องการรับรหัสผลลัพธ์หรือข้อมูลที่เชื่อมโยงกับกิจกรรมที่เสร็จสมบูรณ์แล้ว ให้รับค่าของฟิลด์ result ภายในออบเจ็กต์ ActivityScenario ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

ทริกเกอร์การดำเนินการในกิจกรรม

เมธอดทั้งหมดภายใน ActivityScenario เป็นการเรียกที่บล็อก ดังนั้น API จึงกำหนดให้คุณเรียกใช้เมธอดเหล่านั้นในเธรดการวัดประสิทธิภาพ

หากต้องการทริกเกอร์การดำเนินการในกิจกรรมภายใต้การทดสอบ ให้ใช้ตัวเทียบมุมมอง Espresso เพื่อ โต้ตอบกับองค์ประกอบในมุมมอง

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

อย่างไรก็ตาม หากต้องการเรียกใช้เมธอดในกิจกรรมเอง คุณสามารถทำได้อย่างปลอดภัยโดยการติดตั้งใช้งาน ActivityAction ดังนี้

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}