ทรัพยากรที่ไม่ได้ใช้งานจะแสดงการดำเนินการที่ไม่พร้อมกันซึ่งส่งผลต่อผลลัพธ์ การดำเนินการต่อๆ มาในการทดสอบ 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: การซิงค์กับงานในเบื้องหลัง