เทคนิคการเขียน Unit Test
สำหรับชาว Dev นั้น Unit Test มีความจำเป็นอย่างมากในการพัฒนาซอฟต์แวร์ เหมาะกับการทำงานทั้งกับโปรเจกต์เล็กรวมไปถึงโปรเจกต์ใหญ่ Unit Test ได้เข้ามามีส่วนช่วยในการทดสอบการทำงานของซอฟต์แวร์ในแต่ละส่วน (การทำงานที่เล็กที่สุดที่สามารถตรวจสอบได้) ซึ่งในบทความนี้เราจะมากล่าวถึง Unit Test เบื้องต้นกัน
Unit Test คืออะไร
Unit Test คือวิธีการทดสอบซอฟต์แวร์ที่ใช้ทดสอบส่วนที่เล็กที่สุดของ Code เช่น Method/Function, Module เพื่อแสดงให้เห็นว่า Code ทำงานได้ถูกต้องตามเงื่อนไขที่ Dev เขียนไว้
ทำไมต้องทำ Unit Test ?
Michael Cohn’s testing pyramid model
จากรูปพีระมิดนี้แสดงถึงโมเดลของการเขียน Automated Test ในอุดมคติที่เราควรใช้ในการเทสซอฟต์แวร์ ดังนั้นเราควรจะมี Unit Tests หรือการเทสที่ระดับล่างสุดเป็นฐานราก ตามด้วย Service Tests และ UI Tests ซึ่งเป็นการเทสที่ระดับสูงขึ้นมีการเชื่อมต่อระหว่างหลาย Component เป็นตัวที่ต่อยอดขึ้นมาเป็นรูปพีระมิด
ที่ฐานล่าง เราควรมีจำนวนเทสที่เป็น Unit Tests มากที่สุด ก็เพราะเป็นการเขียนที่ทำได้ง่าย สามารถรันเทสได้รวดเร็ว มีความเสถียร ไม่มีปัจจัยอื่นมาทำให้เทส Failed ได้ง่าย ในขณะที่การเทสระดับบนจะสามารถรับรองว่าการเชื่อมต่อระหว่างแต่ละส่วนทำงานร่วมกันได้ถูกต้อง แต่ก็มีหลายปัจจัยที่สามารถกระทบทำให้เทสของเรารันไม่ผ่านได้เยอะกว่า และใช้เวลาในการรันนานกว่า นี่เป็นเหตุผลว่าทำไมเราจึงต้องทำ Unit Test
Unit Testing ที่ดีต้องมีอะไรบ้าง
Unit Test ที่ดีควรมีคุณสมบัติอยู่ 4 ข้อ :
1. Protection against regressions
การเขียน Unit Test จะต้องสามารถหา Bug ได้ เมื่อเรามีการแก้ไข Code หรือเพิ่ม Feature ใหม่เข้าไปแล้วทำให้เกิด Bug ใน Feature เดิมนั้น มันก็ควรจะถูกตรวจจับได้โดย Unit Test ของเราก่อนเป็นอันดับแรก
2. Resistance to refactoring
เทสเคสที่ดีจะต้องมีความทนทานต่อการ Refactor Code เมื่อเราเปลี่ยนโครงสร้างหรือการทำงานของโปรแกรม Unit Test ที่ดีไม่ควรที่จะพัง ซึ่งการเทสที่ดีควรจะสนใจแค่สิ่งที่เราส่งเข้าไปและผลลัพธ์สุดท้ายที่ได้ออกมา โดยไม่ไปผูกกับสิ่งที่อยู่ข้างใน หรือสนใจผลลัพธ์ระหว่างทาง (Black-box testing)
3. Fast feedback
Unit Test ที่ดีจะต้องทำงานได้อย่างรวดเร็ว เพื่อให้ได้ Feedback ที่เร็ว และนำมาปรับแก้ได้ไว
4. Maintainability
Unit Test ที่ดีควรจะอ่านง่ายและสามารถเข้าใจได้ง่าย
ประโยชน์ของ Unit Testing
Early Bug Detection :
ช่วยระบุและตรวจจับจุดบกพร่อ งหรือข้อบกพร่องในระยะแรกของการพัฒนา ซึ่งช่วยลดต้นทุนและความพยายามที่จำเป็นในการแก้ไขปัญหา
Isolation of Issues :
การทดสอบหน่วยแยกหน่วยหรือส่วนประกอบเฉพาะของโค้ด ทำให้ง่ายต่อการระบุและแก้ไขปัญหาในลักษณะที่เป็นเป้าหมาย
Code Quality Improvement :
การเขียน Unit Test มีส่วนช่วยให้คุณภาพของโค้ดดีขึ้น มีโครงสร้างที่ดี และง่ายต่อการบำรุงรักษา ส่งเสริมแนวทางปฏิบัติด้านวิศวกรรมซอฟต์แวร์ที่ดี
Facilitates Refactoring :
ให้ความมั่นใจในการ Refactor หรือปรับโครงสร้างโค้ดใหม่ นักพัฒนาสามารถทำการเปลี่ยนแปลงเพื่อปรับปรุงโค้ดได้โดยไม่ต้องกลัวว่าจะทำลายฟังก์ชันการทำงานที่มีอยู่เดิม ตราบใดที่ผลการทดสอบยังคงผ่าน
Continuous Integration (CI) Support :
Unit Test มักจะรวมเข้ากับระบบ CI ทำให้สามารถทดสอบการเปลี่ยนแปลงโค้ดอัตโนมัติโดยเป็นส่วนหนึ่งของ Pipeline การพัฒนาและการปรับใช้
Increased Developer Productivity :
ช่วยให้นักพัฒนาสามารถตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ และวนซ้ำโค้ดได้อย่างมั่นใจ กระบวนการทำซ้ำนี้สามารถนำไปสู่ประสิทธิภาพการผลิตที่เพิ่มขึ้นและการพัฒนาที่เร็วขึ้น
Improved Collaboration :
Unit Test เป็นพื้นฐานทั่วไปสำหรับนักพัฒนาในการทำความเข้าใจพฤติกรรมที่คาดหวังของโค้ด ความเข้าใจร่วมกันนี้สามารถปรับปรุงการทำงานร่วมกันระหว่างสมาชิกในทีมได้
Enhanced Code Maintainability :
Unit Test มีส่วนช่วยในการบำรุงรักษาโค้ดโดยทำให้แน่ใจว่าการเปลี่ยนแปลงและการอัปเดตจะไม่ทำให้เกิดพฤติกรรมที่ไม่คาดคิด สิ่งนี้มีประโยชน์อย่างยิ่งในโค้ดเบสขนาดใหญ่และซับซ้อน
Supports Test-Driven Development (TDD) :
Unit Test เป็นแนวทางปฏิบัติพื้นฐานในการพัฒนา TDD โดยที่ Unit Test จะถูกเขียนก่อนโค้ดจริง TDD ช่วยในการออกแบบซอฟต์แวร์โดยเน้นที่ข้อกำหนด
สรุป
การเขียน Unit Test เป็นสิ่งที่ขาดไม่ได้สำหรับชาว Dev เพราะจะช่วยให้เราทำงานได้ราบรื่นขึ้น เจอบัคน้อยลง รวมถึงคุณภาพการเขียนโค้ดของเรายังดีขึ้นตามไปด้วย และการเขียน Unit Test ก็ไม่ใช่เรื่องยากอีกต่อไป ถ้าเราเข้าใจว่าโค้ดส่วนไหนที่ควรจะเขียนเทสหรือส่วนไหนที่สามารถเก็บไว้ทำ Integration Test ได้ หรือโค้ดส่วนไหนที่ต้องทำการ Refactor ก่อนถึงจะเขียนเทสได้ง่ายขึ้น
หากต้องการทราบ Software Testing มีกี่ประเภท และวิธีการเลือกใช้ให้เหมาะสม ตามไปอ่านได้ที่ Blog - Software testing มีกี่ประเภท และวิธีการเลือกใช้ให้เหมาะสม (sennalabs.com) หวังว่าบทความนี้จะเป็นประโยชน์กับผู้อ่านทุกท่านไม่มากก็น้อยค่ะ
แหล่งที่มา
Unit Test ที่ดีควรจะเป็นยังไง?