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

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

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