การทดสอบแบบ 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 สามารถคืนค่า object ที่มี property ใดก็ได้ตามต้องการ จึงไม่สามารถตรวจจับความไม่สอดคล้องกับ DB schema ได้ incident ที่ว่า "test ผ่านทุกรายการ แต่เกิด column does not exist ใน production" นั้นไม่ใช่เรื่องแปลก Unit test มีความแข็งแกร่งในการตรวจสอบ business logic แต่ความสอดคล้องของ system boundary จำเป็นต้องเสริมด้วย functional test หรือ E2E test
TDD (Test-Driven Development) คือแนวทางการพัฒนาที่ใช้ unit test เป็น "เครื่องมือออกแบบ" การเขียน test ก่อนทำให้ข้อกำหนดด้านอินพุตและเอาต์พุตของฟังก์ชันถูกกำหนดขึ้นก่อนการ implement ทั้งสองสิ่งนี้ผูกพันกันอย่างใกล้ชิด เนื่องจาก TDD มี unit test เป็นพื้นฐาน


การทดสอบเชิงฟังก์ชัน (Feature Test) คือวิธีการทดสอบที่ตรวจสอบพฤติกรรมของระบบในระดับฟังก์ชันหรือ Use Case ที่เฉพาะเจาะจง โดยครอบคลุมขอบเขตที่กว้างกว่าการทดสอบแบบ Unit Test และมุ่งยืนยันว่าโมดูลหลายตัวทำงานร่วมกันได้อย่างถูกต้อง

การทดสอบ E2E (End-to-End Testing) คือวิธีการทดสอบที่จำลองการกระทำของผู้ใช้เป็นจุดเริ่มต้น แล้วส่งผ่านระบบทั้งหมดผ่านทาง Browser หรือ API เพื่อตรวจสอบว่าได้ผลลัพธ์ตามที่คาดหวังหรือไม่

การทดสอบการยอมรับ (Acceptance Test) คือวิธีการทดสอบที่ใช้ตรวจสอบว่าฟีเจอร์ที่พัฒนาขึ้นนั้นตรงตามความต้องการทางธุรกิจและ User Story หรือไม่ โดยพิจารณาจากมุมมองของ Product Owner และ Stakeholder

คู่มือสอบใบรับรอง AWS: อธิบายครบทุกขั้นตอนตั้งแต่การสมัครจนถึงวันสอบ

ATDD (Acceptance Test-Driven Development) คือวิธีการพัฒนาซอฟต์แวร์ที่ทีมงานทั้งหมดร่วมกันกำหนดเกณฑ์การทดสอบการยอมรับ (Acceptance Test) ก่อนเริ่มการพัฒนา จากนั้นจึงทำการ Automate การทดสอบดังกล่าว แล้วจึงดำเนินการ Implement ต่อไป