Introduction of Unit Test for Android

ความรู้พื้นฐาน สำหรับนักพัฒนาที่ต้องการพัฒนาแอปพลิเคชันไปพร้อมๆกับการทดสอบแอปพลิเคชัน

What’s a Unit Test?

Unit Test คือ การทดสอบการทำงานในแต่ละหน่วยย่อยของแอปพลิเคชัน เช่น function หรือ method เพื่อให้มั่นใจว่าแต่ละหน่วยย่อยสามารถทำงานได้อย่างถูกต้อง ซึ่งเป็นประโยชน์อย่างมากต่อการทดสอบการทำงานของแอปพลิเคชันที่มีการประสานงานกันระหว่างหน่วยย่อยต่างๆ

Unit Test สามารถแบ่งออกเป็น 2 ประเภทใหญ่ๆ คือ

  1. Local Unit Test เป็นการทดสอบการทำงานบน Java Virtual Machine(JVM) ใช้สำหรับการทดสอบโค้ดที่ไม่มี dependency กับ Android Framework หรือมี dependencies ง่ายๆที่เราสามารถสร้าง mock data ขึ้นมาเองได้ เช่น การนำค่าจาก android resources มาใช้ซึ่งสามารถใช้ Mockito framework ช่วยทำ mock data ได้ โดย framework ที่ใช้ในการเขียน Local Unit Test คือ JUnit
  2. Instrumented Unit Test หรือเรียกให้เข้าใจง่ายว่า Android Unit Test เป็นการทดสอบการทำงานบน Android Environment (รันบน physical device หรือ emulator) เพื่อทดสอบโค้ดที่มีการเรียกใช้ resources และ components ต่างๆ ของแอนดรอยด์ เช่น Context, Parcelable, SharedPreferences เป็นต้น นอกจากนี้ยังสามารถทดสอบ Life cycle ของ Activity หรือ Fragment ได้อีกด้วย โดย framework ที่ใช้ในการทดสอบคือ AndroidJUnitTestRunner ซึ่งเป็นส่วนหนึ่งของ Android Testing Support Library
ที่มา: https://developer.android.com/training/testing/start/index.html

** การรันทดสอบแบบ local บน JVM จะใช้เวลาในการ run และ execute น้อยกว่าการทดสอบบน Android devices เนื่องจากไม่ต้องบิวต์แอปขึ้น devices ก่อน เพื่อประสิทธิภาพในการทดสอบ จึงควรเลือกใช้วิธีการทดสอบที่เหมาะสม (If possible prefer to use local test) **

Project Structure for Testing

Android Project Structure จะแยกชุดโค้ดที่ใช้สำหรับทดสอบออกจากชุดโค้ดที่เป็นส่วนของการทำงานของแอปพลิเคชัน โดย default เมื่อสร้าง Project with Activity ขึ้นมา Android Studio จะสร้างโครงสร้างของแอปพลิเคชันที่มีส่วนของการทดสอบ Unit Test ขึ้นมาให้ด้วย จากรูปด้านล่าง ในส่วนของโครงสร้าง module-name/src จะประกอบด้วย 3 ส่วนหลักๆ คือ

  1. module-name/src/main เป็นส่วนของ source code ในการทำงานของแอปพลิเคชันทั้งหมด
  2. module-name/src/test/java เป็นส่วนของ Local Unit Test
  3. module-name/src/androidTest/java เป็นส่วนของ Instrumentation Unit Test

การ implement Unit Test ตาม Structure ที่กล่าวมาข้างต้น จะช่วยให้ Android Build System แยกการทดสอบอัตโนมัติไปยัง target ได้อย่างถูกต้อง (บน JVM หรือ Android Devices/Emulators)

Android Project structure

อ่านมาถึงตรงนี้ น่าจะทำให้พอเข้าใจภาพรวมของ Unit Test และโครงสร้างเริ่มต้นสำหรับการเขียน Unit Test ในแอนดรอยด์แล้ว ในบทความต่อไป Android Unit Testing Tools จะกล่าวถึง tools ต่างๆ ที่ช่วยในการเขียนโค้ดเพื่อใช้ในการทดสอบแอปพลิเคชันและตัวอย่างการใช้งานเบื้องต้น ฝากติดตามกันด้วยนะคะ

References: