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

เก็บตกความรู้ที่น่าสนใจจาก session Android Testing

$
0
0

Screen-Shot-2558-06-23-at-12.33.54-AM

Screen-Shot-2558-06-23-at-12.33.54-AM จากงาน Android Dev Summit 2015 นั้น ได้นั่งดู VDO เรื่อง Android Testing ซึ่งได้แนะนำเทคนิคที่น่าสนใจเกี่ยวกับการพัฒนา Android app รวมทั้งวิธีการทดสอบ ดังนั้น มาดูกันหน่อยว่ามีอะไรที่น่าสนใจบ้าง

1. เกี่ยวกับการจัดการ version ของ Library ต่าง ๆ

ทำการประกาศตัวแปรสำหรับกำหนด version ของ library ต่าง ๆ ไว้ในไฟล์ build.gradle ที่ root project ตัวอย่าง [gist id="ae92b71ebf84214dcef2" file="root_build.gradle"] ส่วน module ไหนต้องการใช้งาน หรืออ้างถึงตัวแปรเหล่านี้ ก็ใช้งานผ่าน rootProject.ext.variable_name ได้เลย ตัวอย่าง [gist id="ae92b71ebf84214dcef2" file="app_build.gradle"] น่าจะเห็นข้อดีของการจัดการ version ของ library ต่าง ๆ แล้วนะครับ นั่นคือ จัดการเพียงที่เดียวไงล่ะ สบายกว่าเดิมเยอะ !!

2. เกี่ยวกับโครงสร้างของ project สำหรับการทดสอบ

ประกอบไปด้วย folder ต่าง ๆ ดังนี้
  • androidTest เก็บ Android test เช่นเดิม ซึ่งจำเป็นต้องใช้ Emulator หรือ device จริง ๆ
  • androidTestMock เก็บ Android test สำหรับ mock flavor โดยเฉพาะ ซึ่งใช้สำหรับการทดสอบบน Hermetic environment นั่นเอง
  • main ใช้เก็บ code หลักของระบบ
  • mock ใช้สำหรับการ custom mock flavor นั่นเอง จะมี Injection class เพื่อใช้งานพวก dummy และ fake data แทนระบบจริง
  • prod ตรงข้ามกับ mock เลย นั่นคือทำงานบนของจริง
  • test เก็บพวก Unit test
แสดงดังรูป Screen Shot 2558-12-07 at 11.37.54 AM

3. เกี่ยวกับการทดสอบโดยใช้ความสามารถของ Build Variant กับ Dependency Injection

โดยใน project จะมี Build Variant ดังนี้
  • mockDebug
  • prodDebug
  • proRelease
แสดงดังรูป Screen Shot 2558-12-07 at 10.20.10 AM คำถาม สิ่งที่น่าสนใจ คือ ถ้าเราทำการทดสอบผ่าน Mock server ล่ะ จะเปลี่ยนการทำงานภายใน code อย่างไร ? คำตอบ วิธีการที่เรา ๆ ท่าน ๆ ทำกันก็คือ comment เอาสิ แล้วก็ทำการ build ใหม่ !! แต่จาก VDO เรื่อง Android Testing ได้แนะนำวิธีการที่ดูดี และ ยึดหยุ่นกว่า นั่นคือใช้งานผ่าน Dependency Injection สิ ประเด็นหลักคือ การแยก หรือ Isolate พวก Dependency ออกจากการทำงานก่อน เช่นการดึงข้อมูลจาก APIs เราสามารถแยกการทำงานด้วยการสร้าง Interface ขึ้นมาดังนี้ [gist id="ae92b71ebf84214dcef2" file="BlogServiceAPI.java"] จากนั้นใน folder mock เราจะทำการสร้าง class Injection ขึ้นมา เพื่อเป็นตัวกลางสำหรับการเรียกใช้ข้อมูลจาก Dummy และ Fake server โดย class Injection จะมีทั้งใน folder mock และ prod ซึ่ง Injection ใน prod นั้นจะเป็นของจริงนั่นเอง แสดงดังรูป Screen Shot 2558-12-07 at 11.00.27 AM สำหรับการเรียกใช้งานก็เพียงสร้าง instance ของ Injection ซะ [gist id="ae92b71ebf84214dcef2" file="CallInjection.java"] เท่านี้ก็ใช้งานได้แล้ว ซึ่งสามารถทำการทดสอบ แยกตาม environment ที่เราต้องการได้เลย สะดวกมาก ๆ เช่น ./gradlew assembleMockDebugAndroidTest ./gradlew assembleDebugAndroidTest น่าจะทำให้การทดสอบ Android app เป็นเรื่องที่สนุกมากยิ่งขึ้นนะครับ และสามารถดูตัวอย่างได้จาก CodeLab::Android Testing ทำการอธิบายแยกเป็นเรื่อง ๆ อย่างชัดเจน พร้อมตัวอย่าง code
ใครยังไม่เขียน test สำหรับ Android app บ้างนะ ?

Viewing all articles
Browse latest Browse all 1997

Trending Articles