จากการแบ่งปันเรื่องของ Automation Test ด้วย Espresso สำหรับ Android app
ปัญหาอย่างหนึ่งที่พบเจอคือ
เมื่อต้องทำการสอบระบบงานที่ทำงานแบบ Background operation
ยกตัวอย่างเช่น
การเชื่อมต่อไปยัง REST API หรือ WebService ด้วย Retrofit และ OkHttp
รวมทั้งการจัดการเรื่องของ Thread เอง

โดยสิ่งต่าง ๆ เหล่านี้อยู่เหนือขอบเขตความสามารถของ Espresso

คำถามคือ แล้วจะจัดการอย่างไรดีละ ?
เรามาหาคำตอบกัน

เริ่มจาก code ตัวอย่างของระบบงานกันดีกว่า

ซึ่งทำการเรียกใช้งานข้อมูลจาก REST API ด้วย Retrofit และ OkHttp ดังนี้

เมื่อทำการเขียนชุดทดสอบด้วย Espresso ดังนี้

ผลที่ออกมาคือ Error หรือการทดสอบไม่ผ่าน

แนวทางในแก้ไขเป็นอย่างไร ?

เริ่มต้นด้วยแนวทางสุดฮิตคือ รออะไรจัดไปด้วย Thread.sleep()
แต่วิธีการนี้มันไม่ stable เลย
บางเครื่องช้า บางเครื่องเร็ว ทำให้การทดสอบพังบ้างไม่พังบ้าง
ทำให้หลาย ๆ คนหมดความเชื่อถือกับชุดการทดสอบ
บางคนกำหนดเวลาการรอไปเป็นนาทีเลยก็มี
ไม่รู้จะรออะไรกันนานขนาดนั้น !!
แสดงดัง code นี้

ดังนั้นมาหาวิธีการที่ดีกว่ากันหน่อย

ใน Espresso นั้นได้เตรียม Idling resource ไว้ให้

ใครไม่ใช้นี่ถือว่า บาปนะเออ (อันนี้พูดเล่น เพราะว่าคนไม่รู้กันสักเท่าไร)
แต่ถ้ารู้แล้วก็ใช้กันนะ
ดังนั้นต้องเขียน Idling resource เพื่อจัดการกับ OkHttp
แต่ยังก่อน
เนื่องจากมีคนใจดีทำไว้ให้คือ OkHttp Idling Resource

การใช้งานก็ไม่ยากเลยมั้ง !!
เริ่มด้วยการเพิ่ม dependency/library ใน build.gradle

จากนั้นทำการแก้ไขไฟล์ MainActivity
ด้วยการเพิ่ม OkHttp3IdlingResource เข้าไป

เพียงเท่านั้นชุดการทดสอบก็จะผ่านแบบชิว ๆ มาก

แต่ยังก่อน !! จาก code ตัวอย่างนั้นจะพบว่า

ส่วนของการใช้งาน Idling Resource นั้นมันอยู่ใน production code เลย
ดังนั้น code ส่วนนี้จะถูกรวมเข้าไปใน APK ด้วย
แต่ code ส่วนนี้ควรอยู่ใน Test หรือ Debug เท่านั้น
ทำให้ต้องเปลี่ยนวิธีการแล้วนะ
ซึ่งมีหลายแนวทาง เช่น

  • ทำการ Inject OkHttpClient มาจากในส่วนของการทดสอบเลย หรือนำ Dagger มาใช้ก็ไม่ว่ากัน
  • ทำการแยก code ในส่วน Debug ออกจาก production code หรือ Release

ใน blog นี้เลือกวิธีง่าย ๆ คือ แยก code ของ Debug และ Release ออกจากกัน

โดยใน Debug จะมีการใช้งาน Idling Resource
ส่วนใน Release จะไม่มี
สามารถทำได้ดังนี้

เริ่มด้วยแก้ไขไฟล์ build.gradle เพื่อระบุใช้ Idling Resource ใน Debug เท่านั้น

จากนั้นก็ตรวจสอบนิดหน่อยสำหรับใช้ใน Debug เท่านั้น

มันก็ทำงานได้นะ

แต่ยังก่อน code มันก็ยังอยู่รวมกันเหมือนเดิม

แน่นอนว่าตอน Release ไม่รอดแน่ ๆ
ดังนั้นให้ทำการแยก code ออกไปตาม build type คือ debug กับ release เลย
แสดงดังรูป

โดยในส่วนของ Debug จะมี code ของการใช้งาน Idling Resource
ส่วนของ Release จะไม่มี ดังตัวอย่าง

เพียงเท่านี้ก็สามารถทดสอบได้แล้วนะครับ
ง่ายไหมละ ?

Source code ตัวอย่างอยู่ที่ Github:: Up1

ขอให้สนุกกับการ coding นะครับ