กิจกรรมทำหน้าที่เป็นคอนเทนเนอร์สำหรับการโต้ตอบของผู้ใช้ทุกครั้งภายในแอป ดังนั้น คุณจึงควรทดสอบลักษณะการทำงานของกิจกรรมในแอปในระหว่างเหตุการณ์ระดับอุปกรณ์ เช่น เหตุการณ์ต่อไปนี้
- แอปอื่น เช่น แอปโทรศัพท์ของอุปกรณ์ ขัดจังหวะกิจกรรมของแอป
- ระบบจะทำลายและสร้างกิจกรรมของคุณขึ้นมาใหม่
- ผู้ใช้จะวางกิจกรรมของคุณในสภาพแวดล้อมการแสดงผลแบบใหม่ เช่น การแสดงภาพซ้อนภาพ (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() } } } }