Quantcast
Viewing all articles
Browse latest Browse all 2063

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

Image may be NSFW.
Clik here to view.

Image may be NSFW.
Clik here to view.
จากการแบ่งปันเรื่องของ 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 เลย แสดงดังรูป Image may be NSFW.
Clik here to view.
โดยในส่วนของ Debug จะมี code ของการใช้งาน Idling Resource ส่วนของ Release จะไม่มี ดังตัวอย่าง [gist id="7a74d4297397365285ebb12dd1360568" file="AddIdlingResources.java"] เพียงเท่านี้ก็สามารถทดสอบได้แล้วนะครับ ง่ายไหมละ ? Image may be NSFW.
Clik here to view.
Source code ตัวอย่างอยู่ที่ Github:: Up1 ขอให้สนุกกับการ coding นะครับ

Viewing all articles
Browse latest Browse all 2063

Trending Articles