การทดสอบหน่วย

การทดสอบหน่วย

การทดสอบแบบ Unit Test คือวิธีการทดสอบที่ตรวจสอบหน่วยย่อยที่สุดของโปรแกรม เช่น ฟังก์ชันหรือเมธอด เป็นรายการ โดยแทนที่การพึ่งพาภายนอกด้วย Mock เพื่อให้สามารถตรวจสอบเฉพาะ Logic ที่ต้องการได้อย่างรวดเร็ว

"หน่วย" ในการทดสอบหมายถึงอะไร

"หน่วย" ในการทดสอบแบบ Unit Test มีระดับความละเอียดที่แตกต่างกันไปตามภาษาและ framework บางครั้งหมายถึงฟังก์ชันเดียว บางครั้งหมายถึงคลาสหนึ่งหรือทั้งโมดูล สิ่งที่มีร่วมกันคือหลักการ "ทดสอบโดยตัดการเชื่อมต่อกับ I/O ภายนอก (DB, network, file system) ออก"

การพึ่งพาภายนอกจะถูกแทนที่ด้วย mock หรือ stub เช่น การคืนค่าผลลัพธ์ query ของ Supabase ผ่าน mock object หรือการแทนที่ API call ด้วย stub วิธีนี้ทำให้เวลาในการรันอยู่ในระดับมิลลิวินาที และสามารถรันได้หลายร้อยถึงหลายพันรายการต่อ commit ใน CI pipeline

ข้อจำกัดของ Mock

เนื่องจาก mock สามารถคืนค่า object ที่มี property ใดก็ได้ตามต้องการ จึงไม่สามารถตรวจจับความไม่สอดคล้องกับ DB schema ได้ incident ที่ว่า "test ผ่านทุกรายการ แต่เกิด column does not exist ใน production" นั้นไม่ใช่เรื่องแปลก Unit test มีความแข็งแกร่งในการตรวจสอบ business logic แต่ความสอดคล้องของ system boundary จำเป็นต้องเสริมด้วย functional test หรือ E2E test

ความสัมพันธ์กับ TDD

TDD (Test-Driven Development) คือแนวทางการพัฒนาที่ใช้ unit test เป็น "เครื่องมือออกแบบ" การเขียน test ก่อนทำให้ข้อกำหนดด้านอินพุตและเอาต์พุตของฟังก์ชันถูกกำหนดขึ้นก่อนการ implement ทั้งสองสิ่งนี้ผูกพันกันอย่างใกล้ชิด เนื่องจาก TDD มี unit test เป็นพื้นฐาน

บทความที่กล่าวถึงคำศัพท์นี้