08 September 2015

Unit Test กับ Instrumentation Test บน Android Studio ต่างกันอย่างไร

Updated on

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

        การเขียนเทสปกติก็จะมีอยู่ 2 แบบด้วยกันคือ Unit Test และ UI Automated Test แต่ทว่าการทำ Unit Test บน Android Studio นั้นจะแบ่งออกมาเป็น 2 ส่วนด้วยกันคือ Unit Test และ Instrumentation Test

แล้ว Unit Test กับ Instrumentation Test นี่มันต่างกันยังไงล่ะ?

        ถึงแม้ว่าทั้งคู่จะเป็น Unit Test เหมือนกัน แต่

        Unit Test จะเป็นการทดสอบ Logic ของโค๊ดจาวาพื้นฐานที่ทำงานได้เลยบน JVM อย่างเช่น Model Class, Business Logic หรือ Utility Class

        Instrumentation Test เป็นการทดสอบการทำงานของโค๊ดที่เกี่ยวข้องกับ Life Cycle, Event หรือ Resource ของแอนดรอยด์

        ต่างกันเพียงแต่ว่า Unit Test จะเข้าถึง Resource ของแอนดรอยด์ไม่ได้ (ก็ต้อง Mock เอาเองทั้งหมด ถ้าอยากทำจริงๆ) ในขณะที่ Instrumentation Test จะมี Resource ให้เรียกใช้งานเพื่อทำการเทสได้

        ดังนั้นจึงทำให้ Unit Test สามารถเทสได้เลยโดยไม่ต้องพึ่งอุปกรณ์แอนดรอยด์ สามารถรันเทสได้ทันทีหลังจาก Build Project เสร็จเรียบร้อย  แต่ Instrumentation Test นั้นจำเป็นต้องพึ่งอุปกรณ์แอนดรอยด์ในการเทส แต่ก็ไม่เหมือนกับ UI Automated Test นะ เพราะตอนเทสมันไม่ได้รันขึ้นมาเป็นหน้าจอแอปพลิเคชัน จะเป็นการเรียกใช้ Resource ของแอนดรอยด์เพื่อเอามาใช้ในการเทสแทน

        ยกตัวอย่างเช่น เจ้าของบล็อกสร้างแอปพลิเคชันตอบคำถามแบบง่ายๆ โดยคำถามนั้นจะสร้างเป็น Model Class ขึ้นมา และคำถามที่เตรียมไว้จะเก็บไว้ใน String Resource จะสามารถแบ่งเขียนเทสได้คร่าวๆดังนี้

Instrumentation Test

        • ทดสอบดึงข้อมูลจาก String Resource
        • ทดสอบการสร้าง Model คำถามจาก String Resource
        • ทดสอบการเปลี่ยนคำถามข้อต่อไป
        • ฯลฯ

Unit Test

        • ทดสอบการสร้าง Model คำถามขึ้นมา
        • ทดสอบการตรวจสอบคำตอบที่ถูกต้อง
        • ทดสอบการสลับตัวเลือกคำตอบ
        • ฯลฯ

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

        สำหรับ Unit Test สามารถอ่านเพิ่มเติมได้ที่ มาเขียน Unit test บน Android application กันเถอะ [somkiat.cc] และ Instrumentation Test สามารถอ่านเพิ่มเติมได้ที่ https://www.somkiat.cc/google-io-rewind-bangkok-2015/