Software Testing สิ่งสำคัญในโลก Software Development ที่มือใหม่มักละเลย
By Arnon Puitrakul - 27 พฤศจิกายน 2025
เคยมั้ยที่เขียนโปรแกรมกันออกมา ทุกอย่างมันดูเหมือนจะรันได้ปกติดี แต่พอใช้งานจริง ปัญหาเพียบ เอามาแก้จุดนึง มันก็เด้งไปอีกจุดนึง เหมือนปัญหาที่วนลูปไม่รู้จบ ปัญหาเหล่านี้จะลดลงได้มาก หากเราให้ความสำคัญกับ Software Testing
ทำไมมือใหม่มักละเลย
ถ้าคุณพึ่งเริ่มเขียน Code ในช่วงแรก ๆ หลาย ๆ ครั้ง เวลาเราได้ Requirement มา เรามักจะอยากลงไปซัดเริ่มเขียน Code เลยทันที พอมีคนบอกว่า เห้ยน้อง ๆ เขียนเทสก่อนสิ มันดูจะเป็นเรื่องที่น่ารำคาญมาก ๆ ส่วนใหญ่มันจะมีความคิดประมาณ 3 อย่างวน ๆ ในหัวนี่ละ
อย่างแรกคือ เขียน Test แมร่งเสียเวลา เอาเวลาไปเขียน Code ให้มันเสร็จจบ ๆ ดีกว่า Deadline มันน่ากลัว มันทำให้เราเลือกตัดสิ่งที่เรา "คิดว่า" ไม่จำเป็นออกไป และแน่นอนว่า เหยื่อรายแรกคือ การเขียน Test อย่างแน่นอน เอาเวลาไปเขียน Code แล้วค่อยมานั่งเขียน Test ละกัน ซึ่งเอาจริง ๆ TODO ที่ Comment ไว้อะ ได้กลับมาดูบ้างปะ
อย่างที่ 2 คือ มั่นหน้ามั่นโหนกมากว่า Logic ที่เราเขียนมันถูกแน่ ๆ มันรอดแหละ ยิ่ง Logic ที่ไม่ซับซ้อนมาก ยิ่งมั่นกันเข้าไปใหญ่เลยละ แต่เชื่อมั้ยว่า บั๊คที่เราเจอกันส่วนใหญ่ ไม่ใช่สิ่งที่เรารู้ แต่มักจะเป็นสิ่งที่เรานึกไม่ถึงมากกว่า เราเรียกมันว่า Edge Case เช่น เรามีช่องใส่อีเมล์เป็นภาษาอังกฤษมา แต่ผู้ใช้ดันกรอกภาษาไทยอะไรไม่รู้เข้ามา หรือ ใจดีใส่ Comma ลงไปในช่องจำนวนเงินให้อีก แหม่
นำมาสู่อย่างสุดท้ายคือ โปรแกรมเล็ก ๆ แค่นี้ Test มือ กด ๆ เอาเองก็ได้ ใช่ มันง่ายจริง เมื่อโปรแกรมเราเล็ก แต่เมื่อโปรแกรมมันค่อย ๆ ขยายออกไป มี Feature เยอะขึ้น จาก Form ใส่อีเมล์ธรรมดา เริ่มมีอะไรมากขึ้น การจะมานั่งลองกดทุก Test Case ด้วยมือทุกครั้งที่มีการแก้ Code มันเป็นอะไรที่เสียเวลามากกว่าการเขียน Test ซะอีก และยังมีโอกาสที่จะผิดพลาด หรือ ลืมเคสนั้น ๆ ได้
การที่เราละเลย Testing มันอาจจะไม่ได้สงผลกระทบกับ วันนี้ แต่มันอาจจะกำลังเป็นการสร้าง หนี้ ที่พอกหางหมูไปเรื่อย ๆ จนวันนึงมันเป็นหนี้ก้อนโต (Technical Debt) ที่แม้ว่าคุณจะเก่งแค่ไหน ก็แก้มันไม่ได้
ลองคิดภาพดูนะว่า ถ้าเกิด เราเขียน Test แล้วเจอบัค เราสามารถแก้ได้ทันที ค่าใช้จ่ายในการแก้ก็คือ เวลาที่เราใช้แก้ หรือถ้าส่งงานเข้าไปที่ QA เขา เจอโยนกลับมาแก้ อย่างมากก็เสียเวลาของทั้งทีมไป แต่ถ้าปล่อยขึ้น Production ไป งานนี้แหละ เสียชื่อเสียง เสียลูกค้า เสียความน่าเชื่อถือไปหมดเลยนะ ดังนั้น การจะบอกว่า การเขียน Test มันเสียเวลา มันไม่จริง เรายอมเสียเวลาเล็กน้อยในตอนนี้ เพื่อประหยัดเวลาและลดความเสี่ยงมหาศาลที่อาจจะเกิดขึ้นกับ เราและทีมของเราในอนาคตได้นั่นเอง
การทำ Test มีประโยชน์ยังไง
ถ้าอ่านถึงตรงนี้แล้วเริ่มเห็นความสำคัญบ้างแล้ว เราอยากจะมาพูดถึง ประโยชน์ของมันกันบ้างดีกว่า เพราะจริง ๆ แล้วการเขียน Test มันไม่ได้แค่ทำให้โปรแกรมเรามีคุณภาพมากขึ้นเท่านั้น แต่ยังทำให้เราดูเก่งขึ้น มีเวลาว่าง และมีความสุขในการทำงานมากขึ้นได้ด้วยละ ขอยก 3 ประโยชน์ที่เราเห็นมากับตัวละกัน
อย่างแรกคือ มันเป็นเหมือน Documentation ให้กับงานเราได้ด้วย ต้องยอมรับว่า พวกเราเหล่า Developer ส่วนใหญ่ แมร่งขี้เกียจทำงานเอการอย่างแน่นอน ปัญหาคือ Comment ใน Code หรือไฟล์ Documentation อาจจะไม่เป็นปัจจุบัน แต่สิ่งที่เป็นปัจจุบัน และอนิจจังได้แน่นอนคือ Test เราไม่จำเป็นต้องไปนั่งแกะทุกบรรทัดว่า Function นี้ทำงานยังไง เพราะถ้าเราไปเปิด Unit Test เราจะเห็นเลยว่า Input มันคืออะไร และ Output ที่คาดหวังคืออะไรในแต่ละ Case รวมถึง Edge Case ด้วยซ้ำ
อย่างที่ 2 คือ พอ Project ทำงานถึงจุดนึง ที่เราอาจจะต้อง รื้อ หรือ Refactor ถ้าเป็นเมื่อก่อน เราอาจจะไม่อยากทำเท่าไหร่ เพราะจะเจอปัญหาว่า รื้อตรงนี้ แมร่งไป พังอีกที่เฉยเลย กลายเป็นว่าเวลาผ่านไปเราก็จะไม่กล้ารื้ออะไรแล้ว และปล่อยให้ Code เก่า ๆ ชุดนั้นเป็นไปเรื่อย ๆ อะไรที่ใช้งานได้แล้วก็อย่าไปยุ่งกับมันแค่นั้นเลย แต่การทำ Software Testing มันเป็นเหมือน Safety Net ให้เรา เมื่อเรามี Test Coverage แล้ว หากเราเอาอะไรออก เราก็แค่รัน Test ชุดนั้นเช็คไปได้เลยว่า มันยังทำงานในแบบที่ควรจะเป็นอยู่มั้ย ถ้าพัง มันจะด่าเราเลยละ ก่อนที่ ข้อผิดพลาดนั้น จะเกิดกับผู้ใช้ ถึงตอนนั้น ก็ชิบหายกันทั้งทีมแน่นอน Team Lead แกตัวแรกเลย
และสุดท้ายคือ คนมีข้อผิดพลาดกันได้ บางทีลืมชุดนั้นชุดนี้ ลืมเขียนนั่นนี่เข้าไป เทสไป 100 รอบ ไม่รู้ว่าแต่ละรอบเหมือนกันเป๊ะ ๆ มั้ยอีก แต่การทำ Test เราสามารถสร้าง Automated Test ที่ไม่มีวันพลาดจากที่เรากำหนดไปได้ เผลอ ๆ สามารถช่วยเรารัน 1,000 Test ให้เราได้แบบ แม่นยำ เหมือนเดิมเป๊ะ ๆ ทุกครั้ง ผลักอีพวกงานซ้ำซากออกไปให้เครื่องช่วยทำ เอาเวลาไปโฟกัสกับปัญหาตรงหน้าดีกว่าเถอะ
ดังนั้นสุดท้ายแล้ว การเขียน Test มันทำให้เรานอนหลับฝันดี มั่นใจในระบบของเรามากขึ้นว่า มันจะไม่ล่มปากอ่าวกลางดึกที่คุณกำลังเล่นว่าวอยู่แน่นอน
Testing Pyramid
ในโลกของ Software Testing เรามักจะเปรียบเทียบการทำ Test เหมือนพีระมิด โดยแบ่งออกเป็น 3 ระดับหลัก ๆ
ระดับแรกที่เป็นฐานคือ Unit Test เป็นจุดเริ่มต้นที่ง่าย และคุ้มค่าที่สุด ถือว่าเป็นการทดสอบหน่วยย่อยที่สุด เช่นในระดับของ Function ว่าทำงานได้อย่างถูกต้องตาม Logic ที่เรากำหนดไว้หรือไม่ เช่น มี Function สำหรับการคำนวณ VAT หากเราใส่ 100 ไป ก็ต้องคืนค่า 7 เสมอ โดย Library ที่เรามักจะใช้กัน ก็ขึ้นกับภาษาที่เราใช้งานเช่น TypeScript ก็จะมี Jest ส่วน Java ก็มี JUnit หรือ Go มันก็จะมี Built-in Library อยู่แล้ว
ขยับขึ้นมาอีก คือ การทดสอบการเชื่อมต่อ ระหว่างชิ้นส่วนต่าง ๆ เช่น API กับ Database หรือระหว่าง Service ต่าง ๆ เป้าหมายคือ เราต้องการหาจุดตายตอนที่เราต่อแต่ละส่วนเข้าด้วยกัน เช่น หากเรากดสั่งซื้อของแล้ว คำสั่งซื้อมันเข้าไปโผล่ใน Database อย่างถูกต้องหรือไม่ เครื่องมือที่เราใช้งานกันเช่น Postman เป็นต้น
และสุดท้ายจุดสูงสุด คือ End-to-End Testing (E2E Testing) อันนี้คือ จำลองเหมือนผู้ใช้มานั่งกดใน App ของเราจริง ๆ เพื่อให้มั่นใจว่า การใช้งานหลักจะสามารถใช้งานจริง และถูกต้อง ตั้งแต่ต้นจนจบในแต่ละกระบวนการ เช่น เราให้ กดใส่ของในตระกร้า ใส่ที่อยู่ และจ่ายเงินเข้าไป ตัวอย่างของเครื่องมือที่ใช้ในขั้นตอนนี้คือ Robot Framwork และ Cypress
อีกการทดสอบที่ไม่ได้อยู่ในพีระมิดนี้ แต่โคตรคำคัญมาก ๆ คือ Security Testing หรือ Penetration Test เป็นการทดสอบในเรื่องของความปลอดภัย โดยการสวมหมวกโจรพยายามหาช่องโหว่ในระบบของเรา ก่อนที่โจรตัวจริงมาเล่า เครื่องมือที่ใช้กันเช่น OWASP ZAP และ Burp Suite
หากต้องการเริ่มต้น เราควรเริ่มอย่างไร ?
ทีนี้ ถ้าเราต้องการเริ่มต้นละ เราจะเริ่มต้นมันยังไง แต่ละอย่าง มันเยอะแยะไปหมด เราจะบอกว่า ใจเย็นก๊อนนน คือมันไม่ได้ทำเสร็จได้ในวันเดียวแน่ ๆ
ต้องเริ่มจากว่า ค่อย ๆ เขียน Test ขึ้นไปเรื่อย ๆ การจะเขียนในครบ 100% Coverage ตั้งแต่วันแรก เป็นอะไรที่ยากมาก ๆ อยากจะแนะนำว่า ให้พยายามเริ่มจากส่วนที่สำคัญที่สุด เป็น Critical Section ของโปรแกรมเราก่อนเลย เพราะทำแค่ส่วนนั้นก็สามารถสร้างความแตกต่าง และเพิ่มการประกันคุณภาพให้กับ Software ของเราได้มหาศาลแล้วละ
อีกเรื่องคือ ลบภาพ เครื่องมือสำหรับการทำ Test ที่ยุ่งยากไปได้เลย เพราะเดี๋ยวนี้ เครื่องมือมันถูกพัฒนาไปไกลมากแล้ว มันทำให้เราสามารถเริ่มใช้งานได้โคตรง่ายมาก ๆ เผลอ ๆ บาง Framework เขามีการ Include ติดตั้งลงมาใน Project ของเราให้เองเลย เช่น Laravel ที่เป็น PHP Framework เขาจะติดตั้ง PHPUnit มาให้เราตั้งแต่สร้าง Project แล้ว ทำให้หากเราต้องการเริ่มทำ Test เราไม่ต้องติดตั้งอะไรแล้ว แค่สร้าง Test แล้วเริ่มทำได้เลย
สุดท้ายคือ เราอยากให้ การเขียน Test มันเป็นนิสัย พยายามฝึกให้ตัวเองเขียน Test ก่อนเขียน Code บ่อย ๆ หรือในอนาคตจะลอง TDD (Test Driven Development) ไปเลย เชื่อปะ ตอนแรก เราเฉย ๆ นะ แต่พอผ่านไปสักพัก มันกลายเป็นว่า เราไม่เขียน Test ก่อน เราจะรู้สึกไม่มั่นใจในการทำงานเลย กับพอเราเขียน ๆ ไป แล้วรัน Test เห็นสีเขียว เขียน All Tests Passed ก็คือ ใจฟูมาก ๆ
สรุป
การทำ Software Testing ไม่ใช่แค่เรื่องของ Software Tester และ QA และมันไม่ใช่ ทางเลือก ที่จะทำหรือไม่ทำก็ได้ แต่เรามองว่า มันคือ มาตรฐาน ของการพพัฒนา Software ในปัจจุบันเลยก็ว่าได้ เพราะมันจะทำให้เรามั่นใจว่า เราจะเป็น Software Engineer มืออาชีพ ที่ส่งมอบผลงานที่มีคุณภาพ และน่าเชื่อถือให้กับองค์กรและผู้ใช้ของเราได้นั่นเอง ฉะนั้น เขียนเถ๊อะ



