มาคุยเรื่อง Automation Test กันต่ออีกซักหน่อย กับอีกหนึ่งปัญหาที่ทำให้
“เมื่อวานยังรันผ่านอยู่เลย ทำไมวันนี้เฟลอีกแล้ว ไม่มีใครแก้อะไรซักนิด”
เคยเจอกันมั้ยคะ
เมื่อวาน pass วันนี้ fail ลอง rerun ดูซักหน่อย pass อีกแล้ว ยังไม่ได้แตะโค้ดสักบรรทัด
อยากจะจับ Automation Test ของเรามาถามว่าเกิดอะไรขึ้น ทำไมผีเข้าผีออกทำอะไรตามใจแบบนี้
บอกเลยว่าคุณไม่ได้เจออยู่คนเดียว
(ใช่ค่ะ พี่กิ่งก็เคยเจอ กว่าจะหาทางแก้ปัญหาได้ บางทีใช้เวลาเป็นเดือน)
และส่วนใหญ่มันไม่ได้เกิดจาก tool ไม่ดี หรือ เราเขียนไม่ดีหรอกค่ะ
อีกหนึ่งในสาเหตุที่เจอบ่อยๆ คือ วิธีที่เราจัดการกับ test data
วันนี้จะพาไปเจาะลึกอีกหนึ่งเรื่องที่มักจะทำให้เจอปัญหาบ่อยๆ ค่ะ
คือ Static Data กับ Dynamic Data
.
🧊 Static Data คืออะไร
คือค่าที่เรากำหนดไว้ตายตัวใน test เลย บางทีเราเรียกว่า hardcode ค่ะ
เช่น บอกไปเลยว่าใช้ username: “test01@test.com” , password: “Test1234”
ข้อดีคือ เขียนง่าย อ่านง่าย และรู้ชัดเจนว่าต้องการผลแบบไหน
แต่! ข้อเสียคือ ถ้า environment เปลี่ยน หรือ data หาย มีคนไปเปลี่ยน password
Test นี้จะพังทันที
.
⚡ Dynamic Data คืออะไร
คือ data ที่เราไม่ได้กำหนดตายตัวค่ะ อาจจะสร้างขึ้นมาใหม่เลย หรือ ดึงมาตอนที่เทสรันอยู่ ไม่ได้ hardcode เอาไว้
เช่น แทนที่จะใช้ username: “test01@test.com” ทุกครั้ง
เราก็อาจจะ random ขึ้นมา หรือใส่ timestamp ลงไปแทน เช่น “test202607231234@test.com”
แล้วยิง API สร้าง user ใหม่ก่อนเทสทุกครั้ง
ข้อดีของวิธีนี้คือ เราจะได้เทสที่ยืดหยุ่นกว่า ไม่ได้ผูกติดกับ data ที่ต้องเตรียม และรันซ้ำกี่รอบก็ได้เหมือนเดิม
แต่ข้อเสียคือ เราจะควบคุมผลเทสได้ยากขึ้น และต้องมีขั้นตอนการจัดการกับ test data เพิ่มขึ้นค่ะ ถ้าทำได้ไม่ดี อาจจะกลายเป็นเพิ่มงานให้เราแทน
.
ลองมาดูตัวอย่างเคสที่ dynamic data ช่วยชีวิตได้จริง
- สมัครสมาชิก
❌ ถ้าเรา hardcode email เอาไว้ → รอบแรกรันผ่าน → รอบสองได้ error ว่าอีเมลซ้ำ
✅ ถ้าแก้ให้ generate email ใหม่ที่ไม่ซ้ำทุกครั้ง → เทสผ่านทุกรอบสบายๆ
.
- Test ทุกข้อใช้ User เดียวกันหมด
❌ ทุก scenario ต้องมี step Login ก่อน แล้วก็ใช้ user เดียวกันหมด
ปรากฏว่า เทสข้อนึงไปแก้ data ที่อีกข้อต้องใช้
หรือบางที run parallel ก็สลับลำดับกัน ใครแก้ก่อนแก้หลังไม่รู้ ชนกันงงไปหมด
✅ แต่ถ้าเราสร้าง user ใหม่ทุกครั้งก่อนจะรันเทสแต่ละข้อ แต่ละเทสก็จะแยกอิสระต่อกัน และรันผ่านสบายๆ
.
- Test ที่ต้องเกี่ยวกับวันที่
❌ ถ้า hardcode วันที่เอาไว้ เวลาผ่านไป เลยวันที่นั้นไปแล้ว เทสก็พัง
✅ถ้าใช้วิธีหาวันแบบ relative เช่น 30 วันก่อนหน้า หรือ วันนี้ , พรุ่งนี้ ก็จะควบคุมผลเทสได้ง่ายขึ้น
ถ้าสังเกตดู ทั้ง 3 เคส เราไม่ได้สนใจว่า email จะเป็นอะไร หรือวันที่คือวันไหน แต่เราแค่ต้องการข้อมูลที่ใช้ได้ และไม่ซ้ำกันเท่านั้น
.
📌 แต่ไม่ได้แปลว่า Static Data ไม่ดี
ไม่ใช่ว่าเราจะ hardcode data ไม่ได้เลยนะคะ การใช้ static data จริงๆ แล้วเป็นสิ่งที่ควรทำมากที่สุด ถ้าเราสามารถควบคุมมันได้ (เช่น สามารถ seed database เข้าไปก่อนเริ่มรัน เพื่อใช้ data ที่กำหนดไว้แล้ว) เพราะมันจะทำให้ผลเทสคาดเดาได้เสมอ และเราจะรู้แน่นอนว่าผลลัพธ์ที่อยากได้คือแบบไหน (เราเรียกมันว่า deterministic ค่ะ คือ test ที่รันกี่รอบก็ให้ผลเหมือนเดิม)
ลองมาดูตัวอย่างกันค่ะว่าเคสแบบไหนที่เราใช้ static data ได้บ้าง
✅ Boundary Testing
เช่น ต้องอายุ 18-60 ปี ถึงจะใช้ได้ เราก็ต้องเทส 17 18 19 59 60 61 เป๊ะๆ จะดีกว่าไปสุ่มค่ามามั่วๆ ค่ะ
✅ การคำนวณที่ต้องมี logic
เช่น ซื้อของ 100 บาท 3 ชิ้น และคิด VAT 7%
เราใส่ expect result ไปเลยว่า ราคารวมต้องเป็น 321
ไม่ต้องไปใช้ dynamic input แล้วเอา test script คำนวณ expected result ของเรา เพราะเราจะไม่มีทางรู้ได้เลยว่า logic ที่อยู่ในโค้ดของเทสอันนั้นมันถูกจริงมั้ย ไม่งั้นเราก็จะต้องเพิ่ม test case สำหรับเทส automation test ของเราด้วยค่ะ (เทสซ้อนเทสซ้อนเทสซ้อนเทส)
และที่สำคัญคือ ถ้าเราเอา logic เดียวกับโค้ดของ dev มาใช้ แล้วโค้ดนั้นเกิดมีบั๊กขึ้นมา จะกลายเป็นว่าระบบก็คิดผิด เทสก็คิดผิด แต่ดันตรงกัน เทสเลยให้ผ่าน แล้วบั๊กนั้นก็จะหลุดรอดออกไปได้
.
เห็นมั้ยคะว่ามันไม่ได้มีอะไรตายตัวในการทำ Automation Test เลย
ถ้าเราเข้าใจสิ่งที่เราต้องการ และเป้าหมายที่เราอยากได้ ก็จะทำให้ตัดสินใจได้ดีขึ้นค่ะ
สิ่งที่สำคัญคือ ถามตัวเองก่อนจะเลือกใช้ Test Data ว่าเราต้องควบคุมอะไร และค่าของมันสำคัญต่อผลลัพธ์มั้ย แล้วค่อยไปคิดว่าจะใช้ Test Data แบบไหนค่ะ
.
QA ทั่วไป อาจจะเขียน Automation Test เสร็จ ลองรันให้ผ่านแล้วก็จบไป
แต่ QA ร่างทอง จะต้องคิดต่อไปอีกว่า
“รันซ้ำหลายๆ ครั้งผลลัพธ์ยังเหมือนเดิมมั้ย”
“เอาไปรัน Environment อื่นได้มั้ย”
“ต้องเตรียม Test Data เองแบบ Manual มั้ย มีวิธีทำให้มันดีกว่านั้นได้มั้ย”
มันคือการคิดเผื่อ และ เตรียมพร้อม เพื่อให้เราไม่ต้องมาปวดหัวกับการดูแลเทสนี้ทีหลังค่ะ

