Screen Shot 2558-05-10 at 3.21.04 PM
จากการสอบถาม Android developer มาพบว่า
ประมาณ 99% ทำการทดสอบแบบ manual ทั้งหมด !!
(ถ้าใครทำแบบอื่นๆ บอกผมด้วยนะ ^_^)

จากคำตอบที่ได้มานั้น
ทำให้เกิดคำถามที่น่าสนใจ คือ ทำไมถึงทดสอบแบบ manual อย่างเดียวล่ะ

ทำไมถึงไม่ทำการทดสอบแบบ Automated บ้าง ?
ทั้งๆ ที่มันน่าจะช่วยแบ่งเบาภาระลงไปได้เยอะนะ !!

ตัวอย่างการสัมภาษณ์ทีมพัฒนา Android app นิรนาม

คำถาม
ในการพัฒนา Android app คุณทำการทดสอบหรือไม่ ?
คำตอบ
ไม่ทดสอบแล้วจะรู็ได้อย่างไรว่า app ทำงานถูกต้อง … (ถามไม่คิดเลย)

คำถาม
แล้วทดสอบแบบไหนล่ะ ?
คำตอบ
ก็นั่งจิ้มๆ ทดสอบไปไงล่ะ

คำถาม
เป็น manual test แบบ 100% เลยใช่ไหม ?
คำตอบ
ใช่สิ ก็บอกว่านั่งจิ้มๆ ทดสอบยังไงล่ะ !!

คำถาม
แล้วถ้าต้องสนับสนุนหลายๆ ยี่ห้อ หลายขนาดหน้าจอล่ะ ทำยังไง ?
คำตอบ
ก็ต้องนั่งจิ้มๆ กันต่อไปยังไงล่ะ

คำถาม
แล้วมันมีปัญหาอะไรหรือเปล่า สำหรับการทดสอบแบบ manual เพียงอย่างเดียว ?
คำตอบ
เยอะมากมายนะสิ !! …
test case ก็เยอะ
เวลาก็มีน้อย
คนทดสอบก็น้อย
เฮ้อ …. มีอีกเพียบ …

คำถาม
แล้วแก้ไขปัญหานี้อย่างไรล่ะ ?
คำตอบ
ขอเวลาในการทดสอบเพิ่ม
ถ้าไม่ได้ก็ต้องจากคนเพิ่ม หรือ หาคนทดสอบเพิ่มนะสิ
มาช่วยกันนั่งจิ้มเยอะๆ จะได้เสร็จเร็วๆ

แล้วมันมีวิธีการทดสอบอื่นๆ อีกหรือไม่นะ ?

ถ้ามันมี Automated testing มาช่วยแบบนี้คงจะดีไม่น้อย

Screen Shot 2558-05-10 at 3.05.30 PM

ก่อนอื่นมาดูว่า การทดสอบที่ดีนั้นควรเป็นไปตาม Pyramid Testing

จะประกอบไปด้วยการทดสอบส่วนต่างๆ คือ

  • Unit testing
  • Integration testing
  • Acceptance testing
  • UI testing
  • Manual testing

แสดงดังรูป

gregory1_fig01

แต่สิ่งที่เรากำลังทดสอบกับ Android app นั้นกลับตรงกันข้าม

นั่นก็คือ ทดสอบแบบ manual มากที่สุด แสดงดังรูป

20130812_testing_ice_cream_cone

คำถามที่ได้รับจากเหล่า Android developer คือ

  • แล้วมันทำได้ด้วยหรือ ?
  • มีใครเขาทำกันบ้าง ?
  • ไม่เห็นมีใครเขาทำกันเลย ?
  • มันทำยากนะ ?
  • แบบนี้ก็ต้องเพิ่มเวลาในการพัฒนาอีกสิ ?
  • มันจะคุ้มหรือ ?
  • ทำอย่างไรล่ะ ?

ซึ่งผมไม่มีคำตอบอะไรให้หรอกนะ …
แต่อยากจะถามว่า ที่ทำมานั่นนะ มันมีปัญหาอะไรบ้าง ?
แล้วเคยคิดที่จะแก้ไขกันบ้างหรือไม่ ?
หรือปล่อยไปแบบนั้นล่ะ มันคือข้อจำกัดนะ ต้องทำใจ ?

ดังนั้นก่อนอื่น มาเรียนรู้ก่อนนะว่าทางผู้พัฒนา Android SDK เข้าสนับสนุน Automated testing นะ

ถ้าไม่เชื่อลองเข้าไปดูที่ Best practice for Android testing
ประกอบไปด้วย

  • Unit testing
  • Functional testing
  • UI Component testing
  • Automated UIO testing

คำถาม
เคยอ่านกันไหม หรือไปหาแต่ใน google หรือ stackoverflow กัน ?
คำตอบที่ดูดีหน่อย
เคยอ่านเมื่อนานมาล่ะ แต่อ่านไม่รู้เรื่องเลย
แถม IDE ที่ใช้พัฒนาไม่สนับสนุนอีก …

รู้หรือยังว่า Android Studio 1.2 เขาสนับสนุน test แล้วนะ ?

ถ้าไม่รู้ก็มาดูกันเลย ว่ามันเป็นอย่างไร

เพียงแค่กำหนด version ของ Gradle build tool ที่ใช้ซะ

Screen Shot 2558-05-10 at 2.31.11 PM

หน้าตาของไฟล์ build.gradle เป็นดังนี้

และสามารถทำการ Run test ได้เลย ดังรูป

Screen Shot 2558-05-10 at 2.28.04 PM

 

แต่การจะทดสอบส่วนการทำงานต่างๆ ของ Android application มันยากมาก

เนื่องจากส่วนการทำงานต่างๆ ผูกติดกับ Android platform เกือบทั้งหมด
ไม่ว่าจะเป็น

  • Application ซึ่งคือ God object ของ Android application
  • Activity คือ class ที่ใช้จัดการ Life cycle ขนาดยักษ์
  • หรือบางคนบอกว่าใช้งาน Fragment สิ … แต่ว่ามันก็ยังยากนะเออ

ปัญหาที่พบเจอใน Android application คือ
ส่วนการทำงานต่างๆ มันผูกติดกับ Android platform หมดเลย
ทำให้เราทดสอบระบบงานยากมากๆ

ดังนั้น สิ่งที่เราต้องทำกันต่อไป คือ
แยกส่วนการทำงานต่างๆ ออกมาจาก Android platform หรือ Isolate dependency
เพื่อให้มันง่ายต่อการทดสอบด้วย JAVA library ทั่วไปได้ เช่น

  • jUnit
  • Mockito