กิจกรรมทำหน้าที่เป็นคอนเทนเนอร์สำหรับการโต้ตอบของผู้ใช้ภายในแอป ดังนั้น คุณจำเป็นต้องทดสอบว่ากิจกรรมของแอปทำงานเป็นอย่างไรในระดับอุปกรณ์ เช่น
- แอปอื่น เช่น แอปโทรศัพท์ของอุปกรณ์ ขัดจังหวะกิจกรรมของแอป
- ระบบจะทำลายและสร้างกิจกรรมของคุณใหม่
- ผู้ใช้วางกิจกรรมของคุณในสภาพแวดล้อมใหม่ที่เป็นกรอบเวลา เช่น การแสดงภาพซ้อนภาพ (PIP) หรือหลายหน้าต่าง
โดยเฉพาะอย่างยิ่ง คุณต้องตรวจสอบว่ากิจกรรมของคุณทำงานอย่างถูกต้องใน การตอบสนองต่อเหตุการณ์ที่อธิบายไว้ในกิจกรรม วงจร
คู่มือนี้อธิบายวิธีประเมินความสามารถของแอปในการดูแลรักษาข้อมูล ความสมบูรณ์และประสบการณ์การใช้งานที่ดีของผู้ใช้เมื่อกิจกรรมในแอปเปลี่ยนไป ผ่านสถานะต่างๆ ในวงจรชีวิต
ขับเคลื่อนสถานะของกิจกรรม
แง่มุมสำคัญอย่างหนึ่งของการทดสอบกิจกรรมของแอปคือการวางตำแหน่ง
กิจกรรมในบางรัฐ เพื่อนิยามคำว่า "ที่ให้" นี้ ของการทดสอบ ให้ใช้
อินสแตนซ์ของ ActivityScenario
ส่วนของ
ไลบรารี AndroidX Test เมื่อใช้ชั้นเรียนนี้ คุณจะทำสิ่งต่อไปนี้ได้
วางกิจกรรมของคุณในสถานะที่จำลองเหตุการณ์ระดับอุปกรณ์
ActivityScenario
คือ API ข้ามแพลตฟอร์มที่คุณใช้ในการทดสอบหน่วยในเครื่องได้
และการทดสอบการผสานรวมในอุปกรณ์ ในอุปกรณ์จริงหรือเสมือน
ActivityScenario
จะช่วยรักษาความปลอดภัยให้ชุดข้อความและซิงค์เหตุการณ์ระหว่าง
เทรดการใช้เครื่องมือของการทดสอบและเทรดที่เรียกใช้กิจกรรมของคุณภายใต้การทดสอบ
API เหมาะสมอย่างยิ่งสำหรับการประเมินว่ากิจกรรมภายใต้ จะทำงานเมื่อมีการทำลายหรือสร้าง ส่วนนี้ของผู้เผยแพร่โฆษณา Use Case ที่เชื่อมโยงกับ 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
มีประโยชน์อย่างยิ่ง
เพื่อตรวจสอบสถานะของกิจกรรมที่อยู่ระหว่างการทดสอบว่ากิจกรรมเปลี่ยนเส้นทางไปยัง
กิจกรรมอื่นหรือเสร็จสิ้นตัวเอง ดังที่แสดงในโค้ดต่อไปนี้
snippet:
@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() } } } }