ทรัพยากรที่ไม่มีการใช้งานของเอสเพรสโซ

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

ระบุเมื่อต้องใช้ทรัพยากรที่ไม่มีการใช้งาน

เอสเพรสโซ่เป็นส่วนผสมที่ลงตัว ความสามารถในการซิงค์ข้อมูล ช่วงเวลานี้ ของกรอบการทำงาน จะใช้เฉพาะกับการดำเนินงานที่โพสต์ ข้อความใน MessageQueue เช่น คลาสย่อยของ View กำลังวาดเนื้อหาบนหน้าจอ

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

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

  • กำลังเพิ่มสายไปยัง Thread.sleep() เมื่อคุณ เพิ่มความล่าช้าปลอมลงในการทดสอบของคุณ จะทำให้ชุดทดสอบของคุณใช้เวลานานขึ้นในการ เสร็จสิ้น และการทดสอบของคุณอาจยังคงล้มเหลวในบางครั้งเมื่อดําเนินการ อุปกรณ์ที่ทำงานช้าลง นอกจากนี้ ความล่าช้าเหล่านี้ยังปรับได้ไม่ดีนัก เนื่องจากแอปอาจ ต้องทำงานแบบไม่พร้อมกันซึ่งใช้เวลานานมากขึ้นในรุ่นต่อๆ ไป
  • การใช้ Wrapper สำหรับการลองอีกครั้ง ซึ่งใช้การวนซ้ำเพื่อตรวจสอบซ้ำว่า แอปของคุณยังคงทำงานไม่พร้อมกันจนกว่าจะหมดเวลา แม้ว่า คุณระบุจำนวนการลองใหม่สูงสุดในการทดสอบ การดำเนินการซ้ำแต่ละครั้งจะใช้ ทรัพยากรระบบ โดยเฉพาะ CPU
  • ใช้อินสแตนซ์ของ CountDownLatch ซึ่ง อนุญาตให้เทรดอย่างน้อย 1 รายการรอจนกว่าจะมีการดำเนินการ ดำเนินการในชุดข้อความอื่นเสร็จสมบูรณ์แล้ว ออบเจ็กต์เหล่านี้กำหนดให้คุณต้องระบุ ระยะเวลาการหมดเวลา ไม่เช่นนั้น แอปของคุณอาจถูกบล็อกโดยไม่มีกําหนด เหล็กเกี่ยว และเพิ่มความซับซ้อนที่ไม่จำเป็นให้กับโค้ดของคุณ ทำให้การบำรุงรักษายากขึ้น

Espresso จะช่วยคุณขจัดวิธีแก้ปัญหาที่ไม่น่าเชื่อถือเหล่านี้ออกจากการทดสอบ และ แต่ให้ลงทะเบียนงานแบบไม่พร้อมกันของแอปเป็นทรัพยากรที่ไม่มีการใช้งานแทน

กรณีการใช้งานทั่วไป

เมื่อดำเนินการที่คล้ายกับตัวอย่างต่อไปนี้ในการทดสอบ ให้ลองใช้ทรัพยากรที่ไม่มีการใช้งาน:

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

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

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

รายการต่อไปนี้จะอธิบายถึงตัวอย่างการใช้งานทรัพยากรที่ไม่มีการใช้งาน ที่คุณสามารถผสานรวมเข้ากับแอปได้

CountingIdlingResource
รักษาตัวนับของงานที่กำลังดำเนินอยู่ เมื่อตัวนับเป็น 0 ระบบจะเชื่อมโยง ถือว่าไม่มีการใช้งานทรัพยากร ฟังก์ชันนี้คล้ายกับ Semaphore ในกรณีส่วนใหญ่ การติดตั้งแบบนี้จะ เพียงพอสำหรับการจัดการงานแบบไม่พร้อมกันของแอปในระหว่างการทดสอบ
UriIdlingResource
คล้ายกับ CountingIdlingResource, แต่ตัวนับต้องเป็น 0 สำหรับระยะเวลาหนึ่งก่อน ถือว่าไม่มีการใช้งานทรัพยากร ระยะเวลารอเพิ่มเติมนี้ติดต่อกัน คำขอเครือข่าย ซึ่งแอปในชุดข้อความอาจสร้าง ทันทีหลังจากที่ได้รับการตอบกลับคำขอก่อนหน้า
IdlingThreadPoolExecutor
การใช้งาน ThreadPoolExecutor ที่กำหนดเอง ที่ติดตามจำนวนงานทั้งหมดที่ทำงานอยู่ภายในชุดข้อความที่สร้างขึ้น สระน้ำ คลาสนี้ใช้ CountingIdlingResource ถึง จะนับจำนวนงานที่ดำเนินการอยู่
IdlingScheduledThreadPoolExecutor
การใช้งานแบบกำหนดเองของ ScheduledThreadPoolExecutor โดยจะให้ค่า และฟังก์ชัน IdlingThreadPoolExecutor แต่สามารถติดตามงานที่มีกำหนดเวลาในอนาคตหรือ ถูกกำหนดให้ดำเนินการเป็นระยะ

สร้างทรัพยากรที่ไม่มีการใช้งานของคุณเอง

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

หากคุณใช้ฟังก์ชันของทรัพยากรที่ไม่มีการใช้งานของคุณเอง โปรดดำเนินการต่อไปนี้ให้ดีที่สุด โดยเฉพาะข้อแรก นั่นคือ

เรียกใช้การเปลี่ยนเป็นสถานะไม่มีการใช้งานภายนอกการตรวจสอบเมื่อไม่มีการใช้งาน
หลังจากที่แอปไม่มีการใช้งาน ให้โทร onTransitionToIdle() นอกการติดตั้งใดๆ isIdleNow() ด้วยวิธีนี้ เอสเพรสโซไม่ได้ทำการตรวจสอบครั้งที่สองที่ไม่จำเป็นเพื่อระบุว่า ทรัพยากรที่ไม่มีการใช้งานไม่มีความเคลื่อนไหว

ข้อมูลโค้ดต่อไปนี้แสดงคำแนะนำนี้

Kotlin

fun isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

fun backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}

Java

public void isIdle() {
    // DON'T call callback.onTransitionToIdle() here!
}

public void backgroundWorkDone() {
    // Background work finished.
    callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle.

    // Don't do any post-processing work beyond this point. Espresso now
    // considers your app to be idle and moves on to the next test action.
}
ลงทะเบียนทรัพยากรที่ไม่มีการใช้งานก่อนที่จะจำเป็นต้องใช้

ประโยชน์ของการซิงค์ข้อมูลที่เกี่ยวข้องกับทรัพยากรที่ไม่มีการใช้งานจะมีผลเท่านั้น หลังจากการเรียกทรัพยากรนั้นครั้งแรกของ Espresso isIdleNow()

รายการต่อไปนี้แสดงตัวอย่างต่างๆ ของพร็อพเพอร์ตี้นี้

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

หากต้องการสงวนทรัพยากรของระบบ คุณควรยกเลิกการลงทะเบียนทรัพยากรที่ไม่มีการใช้งานทันที เพราะตอนแรกคุณไม่ต้องการแล้ว เช่น หากลงทะเบียนทรัพยากรที่ไม่มีการใช้งาน ในเมธอดที่มีคำอธิบายประกอบด้วย @Before คุณควรยกเลิกการลงทะเบียนทรัพยากรนี้ใน เมธอดที่สอดคล้องซึ่งมีคำอธิบายประกอบ @After

ใช้ idling Registry เพื่อลงทะเบียนและยกเลิกการลงทะเบียนทรัพยากรที่ไม่มีการใช้งาน

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

คงสถานะแอปแบบง่ายภายในทรัพยากรที่ไม่มีการใช้งานเท่านั้น

ตัวอย่างเช่น ทรัพยากรที่ไม่มีการใช้งานที่คุณติดตั้งใช้งานและลงทะเบียนไม่ควร มีการอ้างอิงถึงออบเจ็กต์ View รายการ

ลงทะเบียนทรัพยากรที่ไม่มีการใช้งาน

เอสเพรสโซมีคลาสคอนเทนเนอร์ที่คุณสามารถกำหนดที่ไม่ได้ใช้งานแอปได้ ที่ไม่ซับซ้อน ชั้นเรียนนี้ชื่อว่า IdlingRegistry เป็น อาร์ติแฟกต์ที่มีศักยภาพในตัวซึ่งเพิ่มค่าใช้จ่ายให้แอปน้อยที่สุด ชั้นเรียน ยังช่วยให้คุณทำตามขั้นตอนต่อไปนี้ เพื่อปรับปรุง ความสามารถในการบำรุงรักษา:

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

ผสานรวมทรัพยากรที่ไม่มีการใช้งานลงในแอปของคุณ

แม้ว่าคุณจะสามารถเพิ่มทรัพยากรที่ไม่มีการใช้งานลงในแอปได้หลายวิธี ซึ่งช่วยคงการห่อหุ้มแอปของคุณไว้ ในขณะที่ยังคงทำให้ คุณสามารถระบุการดำเนินการเฉพาะซึ่งทรัพยากรที่ไม่มีการใช้งานหนึ่งๆ แสดง

เมื่อเพิ่มทรัพยากรที่ไม่ได้ใช้งานลงในแอป เราขอแนะนำอย่างยิ่งแนะนำให้วาง ที่ไม่มีการใช้งานตรรกะทรัพยากรในแอปเอง และดำเนินการเฉพาะการลงทะเบียนและ การยกเลิกการลงทะเบียนในการทดสอบ

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

แนวทางทางเลือก

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

  • สร้างตัวแปรของบิลด์ เช่น Gradle ผลิตภัณฑ์ รสชาติและใช้ทรัพยากรที่ไม่มีการใช้งานเฉพาะในบิลด์การแก้ไขข้อบกพร่องของแอปเท่านั้น
  • ใช้เฟรมเวิร์กการแทรกทรัพยากร Dependency เช่น Dagger เพื่อแทรกที่ไม่ได้ใช้งานของแอป กราฟการพึ่งพาทรัพยากรในการทดสอบ หากคุณใช้ Dagger 2 ฟิลด์ ตัวการแทรกเองควรมาจากคอมโพเนนต์ย่อย
  • นำทรัพยากรที่ไม่ได้ใช้งานในการทดสอบของแอปไปใช้ และแสดงส่วนที่เป็น ของการติดตั้งใช้งานของแอปที่ต้องซิงค์ข้อมูลใน การทดสอบ

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

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

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Espresso ในการทดสอบ Android โปรดดู แหล่งข้อมูลต่อไปนี้

ตัวอย่าง

  • IdlingResourceSample: การซิงค์กับงานในเบื้องหลัง