จากที่ทาง Android Developer ทำการเปลี่ยนแปลงเอกสารเกี่ยวกับ Testing strategies
เป็นคำแนะนำแนวทางในการทดสอบ android app
เพื่อสร้าง app ที่มีคุณภาพ ทั้งความเสถียรและน่าเชื่อถือให้มากที่สุด
โดยพยายามให้เจอปัญหาตั้งแต่การ develop process หรือ detect early นั่นเอง
เพื่อลดปัญหบน production รวมทั้งง่ายต่อการ debug หรือ profiling
มาดูกันว่าแนวทางเป็นอย่างไรบ้าง ?

แสดงการทดสอบเป็น 5 layer ดังรูป

Layer 1 Unit tests

เป็นการทดสอบส่วนการทำงานเล็ก ๆ ของ code
โดยไม่มีการทำงานกับ dependency ต่าง ๆ ของ android framework
และไม่จำเป็นต้องใช้งาน emulator หรือ real device

Layer 2 Component tests

เป็นการตรวจสอบการทำงานของ function ต่าง ๆ
เป็นการตรวจสอบการทำงานของ component หรือ module ต่าง ๆ
ว่าแต่ละส่วนทำงานได้ตามที่คาดหวังหรือไม่
ก่อนที่จะนะแต่ละส่วนมาประกอบ หรือ ทำงานร่วมกัน
ยกตัวอย่างเช่น Screenshot testing

Layer 3 Feature tests

เป็นการตรวจสอบการทำงานเมื่อนำเอา
function, component หรือ module ต่าง ๆ มาทำงานร่วมกัน
เป็นการทดสอบที่มีขนาดใหญ่ และ ซับซ้อนมากยิ่งขึ้น
แต่ถ้า layer 1 และ 2 ยังไม่ทำ หรือ ไม่ผ่าน ก็อาจจะทำให้ layer 3 มีปัญหามากยิ่งขึ้น
เช่น flaky test เป็นต้น

ยกตัวอย่างเช่น UI Behavior testing
ทำการตรวจสอบ state การทำงานต่าง ๆ บน UI
ซึ่งใน Android ได้เตรียม library ไว้ให้แล้ว ใช้งานตามที่ต้องการ เช่น

  • Espresso
  • Jetpack compose
  • UI Automator
  • Robolectric

Layer 4 Application tests

เป็นการทดสอบ application ที่ต้องทำการ build เป็น APK file ก่อน (dev/debug build)
จากนั้นทำการติดตั้งลงเครื่อง
เพื่อทำการตรวจสอบการทำงาน
มีการทำงานร่วมกับ external system มากมาย
ซึ่งจำเป็นจะต้องจัดการหรือควบคุมให้ดี
มิเช่นนั้นการทดสอบจะไม่มีคุณภาพ หรือ ขาดความน่าเชื่อถืออย่างมาก

ในการทดสอบจะทำงานร่วมกับการเปลี่ยนแปลงของ device ต่าง ๆ ด้วย
การเปลี่ยนหน้าจอ การหมุนหน้าจอ หรือ การเปลี่ยนภาษา หรือ การเปลี่ยน device เป็นต้น
สามารถใช้งาน UI behavior testing มาใช้งานได้ปกติ

Layer 5 Release candidate tests

ทำการตรวจสอบการทำงานของไฟล์ APK ที่จะ publish ออกไป
ซึ่งการทดสอบคล้ายกับ application tests
แต่ทำการ minify และ optimize แล้วสำหรับ production mode
มีการทดสอบแบบ end-to-end ที่ใหญ่และซับซ้อนขึ้นกว่า
รวมทั้ง environment ที่ทำงานด้วย ก็ใกล้เคียงกับ production อย่างมาก
เพื่อหาปัญหาต่าง ๆ ในการทำงาน
ตลอดจนเรื่องของ performance testing
ที่อาจจะส่งผลกระทบต่อ device และ ผู้ใช้งานอีกด้วย

มีคำแนะนำสำหรับ การทดสอบที่มีขนาดใหญ่ขึ้น
จำเป็นต้องมีความเสถียรอย่างสูง ยกตัวอย่างเช่น

  • Device configuration
  • Prevent synchronization issues
  • Retry mechanisms

ลองศึกษา และ การแนะนำต่าง ๆ หล่านี้ไปใช้งานกันดู
ขอให้สนุกกับการ coding และ testing