![Screen Shot 2559-01-24 at 3.28.10 PM]()
![Screen Shot 2559-01-24 at 3.28.10 PM]()
นั่งทำ slide เกี่ยวกับการทดสอบบน Android application
พบว่ามีเครื่องมือ framework และ service ให้ใช้งานมากมาย
บางครั้งอาจจะเยอะจนเกินไปอีกด้วย
แน่นอนว่า มันยากต่อผู้เริ่มต้นอย่างแน่นอน
ปล. สำหรับคนที่มีประสบการณ์มาแล้ว ยังงงเลย !!
ดังนั้นจึงทำการสรุปไว้นิดหน่อย
พร้อมทั้งข้อดีและข้อเสีย จากมุมมองที่เคยใช้มา
เริ่มกันเลยดีกว่า
ส่วนที่ 1 :: Unit Testing
เริ่มด้วย JUnit หรือ Local Unit testing
ในปัจจุบันนั้นเราสามารถทำการทดสอบในระดับ Unit Testing ด้วย
JUnit ได้แล้วนะ
เพื่อทดสอบการทำงานในแต่ละ class และ แต่ละ method
ตลอดจนการทำงานระหว่าง class อีกด้วย
เป็นการทดสอบที่ทำงานอยู่บน Java Virtual Machine (JVM)
ซึ่งทำงานได้อย่างรวดเร็วที่สุด และ ง่ายที่สุด
โดยการทดสอบแบบนี้
เหมาะสมกับ code ที่ไม่ได้ยืดติดกับ Android เลย
ข้อเสียของ JUnit ก็คือ
เราไม่สามารถใช้งาน class ต่าง ๆ ของ Android ได้โดยตรง
ถ้าจะใช้งานจำเป็นต้องใช้เครื่องมือเสริม
นั่นคือ Mocking framework เช่น
Mockito
แต่ถ้าใช้มากเกินไปก็ไม่ดีเช่นกัน ต้องระวังเรื่อง Mock Bubble ไว้ด้วย
ตัวต่อมา คือ Android Testing Framework หรือ Instrument unit testing
เป็น official สำหรับการทดสอบแบบ Unit testing บน Android
ทำงานผ่าน Android Unit Runner
ทำให้เราสามารถทำการทดสอบได้เหมือนจริง
สามารถใช้งาน class ต่าง ๆ ของ Android Framework ได้โดยตรง
เหมือนกับการทำงานจริง ๆ ของ Android นั่นเอง
แต่การทำงานจะช้ากว่าแบบแรก เนื่องจาก
ต้องทำการ compile และ upload app ไปยัง device หรือ emulator ก่อนเสมอ
นั่นแสดงว่า
การทดสอบด้วย Android Testing Framework
ต้องต่อ device หรือ emulator ไว้เสมอนะครับ
ซึ่งต่างจากแบบแรกที่ไม่ต้องใช้
อีกตัวที่มีมาก่อนทั้งสองคือ Robolectric
เป็น project สำหรับการทดสอบ Android app ที่มีมาก่อนสองตัวแรก
เพื่อทำให้เราสามารถทดสอบได้รวดเร็วกว่าแบบที่สอง
พร้อมกับใช้งาน class ต่าง ๆ ของ Android Framework ได้
ด้วยการ mock และ stub เอาไว้ให้ก่อน
แถมไม่ต้องใช้ device หรือ emulator อีกด้วย
โดยทีมพัฒนาของ Robolectric นั้น active มาก
แต่ข้อเสียสำคัญเลยก็คือ เอกสารที่แย่มาก ๆ
เป้าหมายหลักของ Unit testing คือ
- ความเร็ว
- ความง่าย
- ความถูกต้อง
- Clean code
- Code ที่ทดสอบได้ง่าย (Testable code)
แต่จะเลือกตัวไหนก็ขึ้นอยู่กับความต้องการของคุณ
ส่วนที่ 2 :: Functional Testing
ถ้าพูดให้เข้าใจง่าย ๆ คือ การทดสอบบน device หรือ emulator นั่นเอง
ซึ่งถามว่ามีเยอะไหม ?
ตอบได้เลยว่ามาก แต่ตัวที่เคยใช้งานจริง ๆ ประกอบไปด้วย
1. UIAutomator
ของดีจากทีมพัฒนา Android จาก Google นั่นเอง
สามารถทำการทดสอบ หรือ จำลองการใช้งานของผู้ใช้ตั้งแต่เปิด App ยันปิด App เอง
แต่สามารถใช้งานได้กับ Jelly Bean ขึ้นไปเท่านั้น
แถมการใช้งานไม่ง่ายอย่างที่คิด
แต่สามารถทำการทดสอบ Android app โดยไม่ต้องมี source code เลย
โดยใช้งานร่วมกับเครื่องมือชื่อว่า uiautomatorviewer
เพื่อดูว่าในหน้าจอของ app นั้นมี element อะไร และ จะเข้าถึงอย่างไร
เหมือนกันการดูโครงสร้างของ DOM ของ web page นั่นเอง
แน่นอนว่า UIAutomator ไม่เหมาะสมกับผู้เริ่มต้นแน่นอน
2. Espresso
เป็นเครื่องมือจากทีมพัฒนา Android จาก Google อีกแล้ว
สร้างขึ้นมาจาก Android developer
เพื่อ Android developer โดยเฉพาะ
เนื่องจากจำเป็นต้องเขียน code สำหรับการทดสอบนั่นเอง
แต่การเขียนนั้นไม่ยาก เพราะว่า
Espresso ได้เตรียม API ที่ใช้งานได้ง่าย เช่น
- การค้นหา element ต่าง ๆ ในหน้าจอของ app
- การกระทำต่าง ๆ ต่อ element เช่น การกด การ swipe การกรอกข้อมูล
- การตรวจสอบข้อมูลว่าแสดงถูกต้องหรือไม่
สามารถเริ่มทดสอบจาก activity ใด ๆ ก็ได้
ไม่ต้องเริ่มจาก activity แรกอย่างเดียว
แต่ว่า Espresso นั้นมีปัญหากับพวก Animation อย่างมาก
ดังนั้น device หรือ emulator ควรปิดพวก Animation ก่อนเสมอ
กับพวก Custom View ต่าง ๆ
ข้อเสียอีกอย่างของ Espresso คือ
ไม่สามารถ capture หน้าจอ screen ของแต่ละหน้าจอที่ทำการทดสอบได้
แต่ก็มีเครื่องมือเสริมเช่นกัน เช่น
- Spoon จาก Square นั่นเอง ซึ่งพัฒนา Library ต่าง ๆ ขึ้นมาอย่างมากมาย แต่ปัจจุบันดูเหมือนว่าผู้ดูแลหลักจะหยุดพัฒนาไปแล้ว
- AWS Device Farm
3. Robotium
สำหรับ Android developer ที่รู้จัก และ ใช้งาน Robolectrie มาแล้ว
ก็ย่อมรู้จัก Robotium ด้วยเช่นกัน
การทำงานนั้นเหมือนกับ Android Testing Framework แต่เพิ่มความสามารถอื่น ๆ อีก
ที่สำคัญมันเสถียรอย่างมาก ปัญหาน้อย
แนะนำให้ใช้อย่างยิ่ง
แต่เมื่อมาเจอ Espresso ผมเลยเปลี่ยนใจเท่านั้นเอง !!
4 และ 5 คือ Calabash และ Appuim
โดยส่วนตัวแล้ว Calabash จะติดตั้ง และ ใช้งานง่ายกว่า Appium
ทั้งสองตัวมีการใช้งานที่คล้ายกัน
ต่างกันเพียงเบื้องหลังการทำงานเท่านั้นเอง
โดยทำการทดสอบโดยไม่ต้องมี source code
ขอมีเพียง App เท่านั้นก็สามารถทำการทดสอบได้แล้ว
แต่ข้อเสียคือ ต้องทำการทดสอบแบบ End-to-End testing เท่านั้น
ไม่สามารถเลือก Activity ที่ต้องการจะทดสอบได้
ส่วนการ capture รูปหน้าจอการทำงานสามารถทำได้ง่าย
รวมทั้งรูปแบบการเขียน test case ก็จะง่ายขึ้นมา
ส่วนที่ 3 :: เครื่องมืออื่น ๆ ที่น่าสนใจ
ขอแนะนำตัวเดียวก็แล้วกัน นั่นคือ
Monkey
เป็นเครื่องมือที่มากับ Android framework อยู่แล้ว
แต่มี Android developer น้อยคนมากที่รู้จัก และ นำมาใช้งาน
ถูกสร้างมาเพื่อทดการทดสอบแบบ Stress testing
โดยตัว monkey จะทำการสร้าง event ต่าง ๆ ขึ้นมา
เหมือนกับการจำลองการใช้งานขึ้นมาแบบสุ่มขึ้นมา
มากเท่าไรก็ได้ตามที่ต้องการ
ซึ่งเหมาะมากสำหรับการทดสอบ App ครั้งสุดท้าย
ก่อนทำการ upload App ขึ้น Play Store
พูดง่าย ๆ เลยก็คือ ของดีราคาถูก (ฟรี) ใช้เถอะครับ
หวังว่าจะมีประโยชน์ต่อ Android developer ทุกคน
ที่ต้องการเพิ่มคุณภาพในการพัฒนา application
ทั้งหน้าเก่า และ หน้าใหม่ บ้างนะครับ
วันนี้คุณเขียน Test แล้วหรือยัง ?