Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

Android :: ว่าด้วยเรื่องของการทดสอบด้วย Espresso กับ Retrofit/OkHttp

$
0
0

จากการแบ่งปันเรื่องของ 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 นะครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles