![]()
![]()
จากการแบ่งปันเรื่องของ 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
ใน blog นี้เลือกวิธีง่าย ๆ คือ แยก code ของ Debug และ Release ออกจากกัน
โดยใน Debug จะมีการใช้งาน Idling Resource
ส่วนใน Release จะไม่มี
สามารถทำได้ดังนี้
เริ่มด้วยแก้ไขไฟล์ build.gradle เพื่อระบุใช้ Idling Resource ใน Debug เท่านั้น
[gist id="7a74d4297397365285ebb12dd1360568" file="build2.gradle"]
จากนั้นก็ตรวจสอบนิดหน่อยสำหรับใช้ใน Debug เท่านั้น
[gist id="7a74d4297397365285ebb12dd1360568" file="MainActivity3.java"]
มันก็ทำงานได้นะ
แต่ยังก่อน code มันก็ยังอยู่รวมกันเหมือนเดิม
แน่นอนว่าตอน Release ไม่รอดแน่ ๆ
ดังนั้นให้ทำการแยก code ออกไปตาม build type คือ debug กับ release เลย
แสดงดังรูป
![]()
โดยในส่วนของ Debug จะมี code ของการใช้งาน Idling Resource
ส่วนของ Release จะไม่มี ดังตัวอย่าง
[gist id="7a74d4297397365285ebb12dd1360568" file="AddIdlingResources.java"]
เพียงเท่านี้ก็สามารถทดสอบได้แล้วนะครับ
ง่ายไหมละ ?
![]()
Source code ตัวอย่างอยู่ที่
Github:: Up1
ขอให้สนุกกับการ coding นะครับ