ในการพัฒนา software นั้นเรามักจะได้ยินคำว่า Spaghetti code บ่อยมาก ๆ
ซึ่งก่อให้เกิดปัญหาตามมามากมาย
ส่งผลให้การดูแลรักษาระบบเป็นเรื่องที่ยาก และ ต้องใช้ค่าใช้จ่ายที่สูงมาก ๆ
โดยปัญหานี้ก็ยังพบเจอในชุดการทดสอบอีกด้วย
เนื่องจากทีมพัฒนาไม่สนใจ
เนื่องจากทีมพัฒนาไม่ใส่ใจ
เนื่องจากทีมพัฒนาไม่ทำการปรับปรุงให้ดีขึ้นอย่างสม่ำเสมอ
หรืออาจจะไม่รู้ด้วยว่า สิ่งที่ทำลงไปนั้นมันก่อให้เกิดปัญหาอย่างไร
ดังนั้นสิ่งที่ควรทำก็คือ ปรับปรุงชุดการทดสอบอย่างสม่ำเสมอ
ทั้งการปรับปรุงโครงสร้าง
ทั้งการลบชุดการทดสอบที่ไม่ได้ใช้งาน
ทั้งเวลาในการทดสอบที่ต้องลดลง
รวมทั้งปรับปรุงเรื่องความรู้ความสามารถอีกด้วย
คำถามคือ ปัจจุบันเราทำการปรับปรุงกันบ้างหรือไม่ ?
หรือเพียงทำให้มันเสร็จไปวัน ๆ เท่านั้นเอง !!
ในบทความนี้จะอธิบายเกี่ยวกับรูปแบบของ Spaghetti Pattern ในชุดการทดสอบ
ว่าเป็นอย่างไรบ้าง ?
ว่ามีข้อดีอะไรบ้าง ?
ว่ามีข้อเสียอะไรบ้าง ?
ในการพัฒนาที่เขียนชุดการทดสอบจะพบว่า
จำนวนของชุดการทดสอบจะมากขึ้นเรื่อย ๆ
ที่สำคัญมักจะมีรูปแบบ code ที่เรียกว่า anti-pattern มากขึ้นเช่นกัน
โดย anti-pattern นั้นคือ
รูปแบบของ code ที่เจอเป็นปกติ
เป็นวิธีการที่ทำงานได้ เหมาะมาก ๆ พัฒนาได้เร็วมาก ๆ ในขณะนั้น !!
แต่เมื่อดูให้ดีพบว่า ทำให้เกิดผลกระทบมากมาย
หรือทำให้ชุดการทดสอบพังง่ายมาก ๆ
แต่ถ้าถามว่า มีวิธีการแก้ไขปัญหา หรือ สิ่งที่ดีกว่าหรือไม่ ?
ตอบได้เลยว่า มีสิ
แต่ … นักพัฒนาส่วนใหญ่จะบอกว่า
ไม่
ไม่มีเวลา
เดี๋ยวค่อยกลับทำทีหลัง
ไว้มีเวลาค่อยมาแก้ไข
ทำให้เสร็จก่อนนะ
สุดท้ายคือ ไม่เคยกลับมาแก้ไขเลย (Later is Never)
นี่แหละคือ anti-pattern ที่เกิดขึ้น
ซึ่งเป็นแนวคิด และ วินัยของนักพัฒนาที่ไม่ดีเลยนะ
ผมคิดว่า นักพัฒนาส่วนใหญ่ไม่เป็นแบบนี้กันหรอกนะ
โดยที่ anti-pattern มีมากมายเช่น
- Spaghetti Pattern
- สำหรับ UI testing การเลือก locator ก็สำคัญ
- ใช้ XPath และ CSS selector มาก ๆ ก็แย่ เพราะว่าเปลี่ยน UI ทีก็พังที !!
- การใช้ absolute path เยอะ ๆ ก็ทรมาน
- ถ้าต้องทดสอบชุดการทดสอบแบบ sequential หรือ เรียงลำดับกันก็ไม่น่าจะใช่ เพราะว่า ช้ามาก ๆ
- แต่ละ test case ต้องทำงานต่อเนื่องกันเสมอ
- Code ของการทดสอบแต่ละ test case เยอะ ๆ หรือเอาทุกอย่างมากองรวมกัน น่าจะไม่ใช่แนวทางที่ดี
คำถามคือ ถ้าใครเขียนชุดการทดสอบแล้วเป็นลักษณะนี้
บอกได้เลยว่า ต้องเจอปัญหามากมายอย่างแน่นอน
สุดท้ายอาจจะทำให้ท้อใจท้อกาย
จนทำให้เลิกเขียนเลิกใช้ไปในที่สุด
แล้วก็จะบอกว่า มันไม่ work นะ !!
คำถามคือ สิ่งที่บอกว่าไม่ work มันมาจากไหน ?
ลองตอบกันดูนะ
มาดูรายละเอียดของ Spaghetti Pattern กันบ้าง
หลัก ๆ มาจากขาดประสบการณ์ในการออกแบบ
พูดง่ายว่า ออกแบบได้แย่มาก ๆ
ทั้งในแง่ architecture ของระบบ
ทั้งในแง่โครงสร้างของ code
ทั้งในแง่โครงสร้างของการทดสอบ
ตัวอย่างเช่น
ชุดการทดสอบมีขนาดใหญ่
ชุดการทดสอบนัวเนีย พัวพันกันไปหมด
ชุดการทดสอบหนึ่งต้องรอผลจากการทดสอบหนึ่ง ๆ
ชุดการทดสอบซ้ำ ๆ ในเรื่องเดิม ๆ
ชุดการทดสอบแก้ไขได้ยากมาก ๆ
ชุดการทดสอบไม่ได้อธิบาย business flow อะไรเลย
ชุดการทดสอบไม่สามารถทดสอบซ้ำได้
มีตัวแปรระดับ global ในการทดสอบ ซึ่งแต่ละการทดสอบต้องใช้งานร่วมกัน !!
ถ้าระบบงานทำงานช้า ก็แก้ไขชุดการทดสอบให้รอไปสิ !!
แบบนี้เจอเยอะมาก ๆ
อธิบายการทำงานยากมาก ๆ
ไป ๆ มา ๆ ต้องมานั่ง debug ชุดการทดสอบเหล่านั้นอีก !!
นี่ก็คือรูปแบบคร่าว ๆ ของ Spaghetti นะ
มีใครตกอยู่ในสถานการณ์แบบนี้บ้าง ?
หรือว่ากำลังลงมือสร้างขึ้นมา ?
แต่ว่ามันก็มีข้อดีนะ ไม่เช่นนั้นคงไม่ทำกัน !!
สามารถเริ่มต้นทำได้เร็ว
นั่นคือ Make it work ซึ่งดีมาก ๆ
ถ้ามันทำงานได้แล้ว
สิ่งที่ต้องตามมาเสมอก็คือ Make it right และ Make it fast
แต่พบว่ามักจะไม่ทำกันนะสิ เพราะว่าของมัน work แล้ว
ดังนั้นจึงไปทำงานอื่นต่อเถอะนะ !!
ช่วยทำให้เขียน code น้อยลง
เนื่องจากชุดการทดสอบอื่น ๆ ทำไว้แล้ว
ดังนั้น เราก็แค่รอผลการทำงานจากชุดการทดสอบอื่นก่อน
จากนั้นจึงนำผลมาใช้งานต่อไป !!
ดูเหมือนจะดีนะ เนื่องจากมันคือการ reuse ของที่มี
ลดจำนวน duplication code ลงไปมาก ๆ
แต่กลับทำให้ชุดการทดสอบผูกติดกันแน่นมาก ๆ
ส่งผลให้การทดสอบช้า เนื่องจากต้องรอ
ที่สำคัญทดสอบแบบ parallel ไม่ได้อีก !!
สุดท้ายแล้ว ลองกลับไปดูกันหน่อยว่า ชุดการทดสอบที่เขียนขึ้นมาเป็นอย่างไรกันบ้าง ?
มีลักษณะตาม Spaghetti Pattern หรือไม่ ?
ถ้าใช่ก็ปรับปรุงเถอะนะ จะได้ไม่เป็นภาระต่อไป
แต่ถ้าใครยังไม่เขียนก็กรุณาเขียนด้วยนะ