ในโลกของการพัฒนาโปรแกรม การทดสอบถือเป็นหัวใจสำคัญที่ช่วยให้นักพัฒนารู้ว่าซอฟต์แวร์ที่สร้างขึ้นมาทำงานตามที่ตั้งใจหรือไม่ การทดสอบที่ดีไม่เพียงแต่ตรวจสอบความถูกต้อง แต่ยังช่วยให้เข้าใจข้อผิดพลาดและสามารถแก้ไขได้ตรงจุด ภาษาการเขียนโปรแกรม Go หรือ Golang มีกรอบการทดสอบที่แข็งแกร่งซึ่งช่วยให้นักพัฒนาสามารถเขียนการทดสอบได้ง่าย วันนี้เราจะมาเจาะลึกถึงการใช้ Table-Driven Tests ซึ่งเป็นรูปแบบการทดสอบที่ได้รับความนิยมใน Go
Table-Driven Tests เป็นรูปแบบการทดสอบที่เน้นความสะอาดและความชัดเจนของโค้ด โดยจะกำหนดค่าทดสอบต่างๆ ในรูปแบบของ "ตาราง" ซึ่งประกอบด้วยโครงสร้างข้อมูลที่รวมอินพุตและผลลัพธ์ที่คาดหวังไว้ด้วยกัน โครงสร้างนี้ช่วยให้นักพัฒนามองเห็นภาพรวมของการทดสอบได้ง่ายและสามารถเพิ่มกรณีทดสอบใหม่ๆ ได้โดยไม่ซ้ำซ้อน
โครงสร้างของ Table-Driven Tests ใน Go
ใน Go การทดสอบจะอยู่ในแพคเกจ `testing` มาดูลักษณะทั่วไปของ Table-Driven Tests ใน Go:
package calculator
import "testing"
// ฟังก์ชันที่เราต้องการทดสอบ
func Add(a int, b int) int {
return a + b
}
func TestAdd(t *testing.T) {
// กำหนดตารางของกรณีทดสอบ
tests := []struct {
name string
a, b int
expected int
}{
{"Positive numbers", 2, 3, 5},
{"Zero sum", 0, 0, 0},
{"Negative numbers", -2, -3, -5},
{"Mixed sign numbers", -1, 1, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := Add(tt.a, tt.b)
if result != tt.expected {
t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected)
}
})
}
}
Table-Driven Tests ไม่ได้จำกัดอยู่แค่การทดสอบฟังก์ชันทางคณิตศาสตร์เท่านั้น แต่ยังสามารถใช้กับฟังก์ชันอื่นๆ ได้อีกมากมาย เช่น การจัดการข้อมูล, การแปลงข้อมูล, และการตรวจสอบข้อผิดพลาดในการป้อนข้อมูล เป็นต้น
กรณีศึกษา: การทดสอบฟังก์ชันตรวจสอบอีเมล
ฟังก์ชันสำหรับตรวจสอบรูปแบบของอีเมลเป็นตัวอย่างที่ดีของการใช้ Table-Driven Tests ดังนี้:
package email
import (
"testing"
"regexp"
)
func IsValidEmail(email string) bool {
if len(email) < 6 {
return false
}
re := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
return re.MatchString(email)
}
func TestIsValidEmail(t *testing.T) {
tests := []struct {
name string
email string
expected bool
}{
{"Valid email", "test@example.com", true},
{"Missing @", "testexample.com", false},
{"Missing domain", "test@.com", false},
{"Short email", "a@b.c", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := IsValidEmail(tt.email)
if result != tt.expected {
t.Errorf("IsValidEmail(%s) = %v; expected %v", tt.email, result, tt.expected)
}
})
}
}
Table-Driven Tests เป็นเทคนิคที่ทรงพลังที่ช่วยให้นักพัฒนาสามารถเขียนการทดสอบที่ชัดเจนและมีประสิทธิภาพ มันช่วยให้โค้ดสามารถรักษาได้ง่ายและเข้าใจได้โดยที่ไม่ต้องอ่านผ่านโค้ดที่ซ้ำซ้อน โอกาสนี้ยังถือเป็นคำเชิญชวนน้องๆ ที่มีความสนใจในด้านการพัฒนาโปรแกรมให้มาทดลองเรียนรู้และเข้าใจวิธีการเขียนโค้ดที่ดีผ่านการทดสอบต่างๆ ที่ Expert-Programming-Tutor (EPT) ที่จะเปิดโอกาสการเรียนรู้ที่คุณไม่ควรพลาด
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java c# vb.net python c c++ machine_learning web database oop cloud aws ios android
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com