จากการแบ่งปันเรื่องของ Automation Test ด้วย Espresso สำหรับ Android app
ปัญหาอย่างหนึ่งที่พบเจอคือ
เมื่อต้องทำการสอบระบบงานที่ทำงานแบบ Background operation
ยกตัวอย่างเช่น
การเชื่อมต่อไปยัง REST API หรือ WebService ด้วย Retrofit และ OkHttp
รวมทั้งการจัดการเรื่องของ Thread เอง
โดยสิ่งต่าง ๆ เหล่านี้อยู่เหนือขอบเขตความสามารถของ Espresso
คำถามคือ แล้วจะจัดการอย่างไรดีละ ? เรามาหาคำตอบกัน
เริ่มจาก code ตัวอย่างของระบบงานกันดีกว่า
ซึ่งทำการเรียกใช้งานข้อมูลจาก REST API ด้วย Retrofit และ OkHttp ดังนี้ [gist id="7a74d4297397365285ebb12dd1360568" file="MainActivity.java"] เมื่อทำการเขียนชุดทดสอบด้วย Espresso ดังนี้ [gist id="7a74d4297397365285ebb12dd1360568" file="MainActivityTest.java"] ผลที่ออกมาคือ Error หรือการทดสอบไม่ผ่าน [gist id="7a74d4297397365285ebb12dd1360568" file="result_fail.txt"]แนวทางในแก้ไขเป็นอย่างไร ?
เริ่มต้นด้วยแนวทางสุดฮิตคือ รออะไรจัดไปด้วย Thread.sleep() แต่วิธีการนี้มันไม่ stable เลย บางเครื่องช้า บางเครื่องเร็ว ทำให้การทดสอบพังบ้างไม่พังบ้าง ทำให้หลาย ๆ คนหมดความเชื่อถือกับชุดการทดสอบ บางคนกำหนดเวลาการรอไปเป็นนาทีเลยก็มี ไม่รู้จะรออะไรกันนานขนาดนั้น !! แสดงดัง code นี้ [gist id="7a74d4297397365285ebb12dd1360568" file="MainActivityTest2.java"] ดังนั้นมาหาวิธีการที่ดีกว่ากันหน่อยใน Espresso นั้นได้เตรียม Idling resource ไว้ให้
ใครไม่ใช้นี่ถือว่า บาปนะเออ (อันนี้พูดเล่น เพราะว่าคนไม่รู้กันสักเท่าไร) แต่ถ้ารู้แล้วก็ใช้กันนะ ดังนั้นต้องเขียน Idling resource เพื่อจัดการกับ OkHttp แต่ยังก่อน เนื่องจากมีคนใจดีทำไว้ให้คือ OkHttp Idling Resource การใช้งานก็ไม่ยากเลยมั้ง !! เริ่มด้วยการเพิ่ม dependency/library ใน build.gradle [gist id="7a74d4297397365285ebb12dd1360568" file="build.gradle"] จากนั้นทำการแก้ไขไฟล์ MainActivity ด้วยการเพิ่ม OkHttp3IdlingResource เข้าไป [gist id="7a74d4297397365285ebb12dd1360568" file="MainActivity2.java"] เพียงเท่านั้นชุดการทดสอบก็จะผ่านแบบชิว ๆ มากแต่ยังก่อน !! จาก code ตัวอย่างนั้นจะพบว่า
ส่วนของการใช้งาน Idling Resource นั้นมันอยู่ใน production code เลย ดังนั้น code ส่วนนี้จะถูกรวมเข้าไปใน APK ด้วย แต่ code ส่วนนี้ควรอยู่ใน Test หรือ Debug เท่านั้น ทำให้ต้องเปลี่ยนวิธีการแล้วนะ ซึ่งมีหลายแนวทาง เช่น- ทำการ Inject OkHttpClient มาจากในส่วนของการทดสอบเลย หรือนำ Dagger มาใช้ก็ไม่ว่ากัน
- ทำการแยก code ในส่วน Debug ออกจาก production code หรือ Release