พอถึงจุดนึง Automation Test ของเราจะเริ่ม “หนัก”
มีใครกำลังเจอบ้างคะ
.
ไม่ใช่หนักเพราะมี test case เยอะ มีข้อใหม่ๆ เพิ่มขึ้นทุกวัน
แต่มันหนักเพราะ ทุกครั้งที่กลับมาอ่าน เราจะงง และต้องใช้เวลาทำความเข้าใจมากกว่าเดิม
คนในทีมต้องมาทำต่อ ก็งง “ตัวแปรนี้มาจากไหนเหรอ เอาไว้ทำอะไร”
ส่งให้ Dev ช่วยดูก็งง ให้ Business ช่วยเช็ค ก็งง
หรือไม่ก็ แก้ requirement นิดเดียว แต่ Test พังหลายที่
รัน local ผ่าน แต่ขึ้น CI แล้วต้องไปลุ้นตลอด
.
ส่วนใหญ่เรามักจะคิดว่า ก็ Test มันซับซ้อนขึ้น เยอะขึ้น มันก็เป็นเรื่องธรรมดา
แต่จริงๆ ปัญหามักไม่ได้อยู่ที่โค้ดของ Automation Test ของเราค่ะ
หลายครั้งที่พี่กิ่งเจอ ต้นเหตุส่วนหนึ่งมาจาก test data ที่กระจัดกระจายอยู่เต็มไปหมด
เพราะเราไม่ได้วางมันไว้ให้ถูกที่ตั้งแต่แรก
.
ลองนึกภาพตามดูค่ะ
เรากำลังทำเทสแอป shopping เหมือนเดิม
ก็เลยเขียน helper สำหรับสร้าง product มาไว้ใช้เทส
แล้วเราก็เขียนไว้แบบนี้
addProduct() {
data = getTestData(‘oat milk’);
fillForm(data);
submitForm();
}
Note สำหรับมือใหม่: helper คือ command หรือ function สำหรับช่วยรันเทสได้ง่ายขึ้น
ตรงตัวเลยค่ะ helper = ตัวช่วยนั่นเอง
ก็ดูปกติดี เทสก็รันผ่าน เพิ่ม product ให้เราได้ทุกครั้ง สะดวกด้วย เรียกครั้งเดียวจบ
แต่ถ้าสังเกตดู helper ตัวนี้ รู้ทั้ง “ทำอะไร” และ “ใช้ data อะไร”
เพราะมันไปดึง data ของ oat milk มาให้เราตลอด
แล้วพอเวลาผ่านไป พอ test suite ของเราโตขึ้น ก็เริ่มมีปัญหาตามมา
.
อยู่มาวันนึง มี test scenario ใหม่ ที่ต้องใช้ product ที่มีเงื่อนไขต่างออกไป ใช้ oat milk ในข้อนี้ไม่ได้แล้ว
กลายเป็นแก้ยากมาก เพราะเราดันฝัง oat milk เข้าไปไว้ในโค้ดซะแล้ว
หรือ มีคนใหม่มาเข้าทีม กำลังจะมาเขียน Automation Test ต่อจากส่วนนี้
อยากรู้ว่าใช้ Test Data แบบไหน ก็ต้องมาไล่ดูในโค้ด แทนที่จะดูจาก scenario ได้เลย
หรือ อาจจะแย่ไปกว่านั้น คนใหม่เข้ามา ไม่รู้ว่าทำไมถึงต้องใช้ oat milk ตรงนี้
ก็เลยไปแก้ให้เป็น product อื่น สรุปว่า มีเทสบางข้อพัง เพราะต้องใช้ product ตัวนี้เท่านั้น
.
ปัญหาตรงนี้คือ helper ของเรา รู้มากเกินไปค่ะ
ไม่ว่ามันจะเป็น function ใน page object หรือเป็น helper ที่แยกออกมา
มันควรรู้แค่ “ทำอะไร” ก็พอ แต่ไม่ต้องรู้ว่า “ใช้ data อะไร”
.
จริงๆเราทำแบบนี้ก็พอ
addProduct(data) {
fillForm(data);
submitForm();
}
แล้วตอนที่เรียกใน test scenario ของเราค่อยส่ง data เข้าไปค่ะ
เพราะ scenario เป็นจุดที่ควรจะรู้ว่าใช้ data แบบไหน
product = { name: ‘Almond Milk’, price: 100};
addProduct(product);
.
ทำแค่นี้ helper ของเราก็จะกลายเป็น function ที่ reuse ได้จริงๆ
ไม่ได้ผูกติดกับ data ชุดไหนอีก
อยากเทสด้วยเงื่อนไขอื่น ก็แค่ส่ง data เข้าไป ไม่ต้องไปแตะ helper อีก
.
และสิ่งที่สำคัญกว่านั้นนะคะ
เวลาเราเปิด test scenario นี้ขึ้นมาอ่าน
มันจะเข้าใจง่ายขึ้นมากๆ เพราะจะเห็นทันทีว่า scenario นี้ใช้ data อะไร
ไม่ต้องไปไล่โค้ดหาอีก
อันนี้คือสิ่งที่สำคัญมากๆ นะคะ
การเขียน test ที่คนอื่นอ่านแล้วเข้าใจง่าย
สำคัญกว่าเทคนิคเทพๆ ที่ใช้เขียนโค้ดเยอะเลยค่ะ
.
การเขียน Automation Test ได้ จริงๆ แล้วเป็นแค่จุดเริ่มต้นนะคะ
คนที่จะเติบโตต่อไปได้ ไม่ใช่แค่คนที่เขียนเป็น
แต่คือคนที่เริ่มตั้งคำถามว่า Automation Test ของเรา ยังมี “สุขภาพ” ที่ดีอยู่มั้ย
ดูแลง่ายมั้ย พังง่ายมั้ย คนอื่นอ่านแล้วเข้าใจรึเปล่า
ถ้ามีข้อไหนยังไม่ได้ อาจจะแปลว่าถึงเวลาแล้วที่เราจะเริ่มมองตัวเองในมุมที่ใหญ่ขึ้น กว้างขึ้น
จากคนที่แค่เขียนเทสเป็น ไปเป็นคนที่ดูแลมันได้ด้วยนะคะ

