Software Testing Process # ขั้นตอนการทดสอบซอฟต์แวร์ที่ developer ไม่ควรพลาด

31 ตุลาคม 2562
วันนี้เราจะมาเล่าให้ฟังถึงขั้นตอน ที่สำคัญอีกขั้นตอนหนึ่ง ในกระบวนการพัฒนาซอฟท์แวร์ ที่มีส่วนทำให้โครงการพัฒนาซอฟต์แวร์ประสบความสำเร็จได้นั้น คือ “การทดสอบซอฟต์แวร์ - Software Testing” เพราะนอกจากจะเป็นส่วนสำคัญที่ช่วยให้เราลดเวลาในการตอบคำถามของผู้ใช้งานแล้ว เรายังต้องมาตามแก้ไขปัญหาที่เกิดจากความผิดพลาดของซอฟต์แวร์ระบบอีก ซึ่งการที่ไม่รู้ root cause ของปัญหาที่เกิดขึ้นกับระบบ อาจเป็นสาเหตุทำให้โปรเจ็คนั้นเกิดความ FAILED ขึ้นได้ ดังนั้นเราจึงควรทำการทดสอบซอฟต์แวร์ – Software Testing Process ด้านล่างนี้ก่อนที่จะปล่อยให้ซอฟต์แวร์ไปถึงมือผู้ใช้งานจริง

สร้างมาตรฐานการพัฒนาระบบงาน

ลองนึกดูซิว่า หากซอฟต์แวร์ที่เราพัฒนาขึ้นมา ไม่ว่าจะเป็น Website, Web App หรือ Mobile App ใดๆ ก็ตาม ว่าเมื่อถึงมือผู้ใช้แล้วมันเกิดปัญหา Error ไม่ว่าจะเป็นเพราะการคำนวณผิด การแสดงผลข้อมูลที่ผิดพลาด หรือการที่ระบบไม่สามารถรองรับจำนวนผู้ใช้งานตามสถานการณ์ต่างๆ ได้ จนส่งผลทำให้ธุรกิจนั้นต้องหยุดชะงัก หรือเกิดความเสียหายขึ้นมามันจะน่าสยองขนาดไหน ดังนั้นเราควรจะมีวิธีการป้องกันได้อย่างไร

จากประสบการณ์จริงของสาย DEV TNT ขอยืนยันว่า ยิ่งงานใดที่เราจริงจังและให้ความสำคัญต่อการทดสอบระบบ (Software Testing) มากเท่าใด ก็ยิ่งลดความเสี่ยงที่จะเกิดปัญหาเมื่อถึงเวลาที่จะต้องใช้งานจริงได้มากขึ้นเท่านั้น

แต่ก่อนที่จะเจาะลึกเรื่องกระบวนการทดสอบ หรือ “Software Testing Process” เรามาทำความรู้จักกับกระบวนการพัฒนาซอฟต์แวร์ หรือ “Software Development Process” แบบคร่าวๆ กันก่อนดีกว่า เพราะการทดสอบซอฟต์แวร์ระบบ - Software Testing Process เป็นเพียงแค่ขั้นตอนหนึ่งในกระบวนการพัฒนาซอฟต์แวร์เท่านั้น

กระบวนการพัฒนาซอฟต์แวร์

เรามาดูกันดีกว่า...ว่ากระบวนการพัฒนาซอฟต์แวร์ที่เราใช้เป็นมาตรฐาน ประกอบด้วยอะไรบ้าง ?


  • ก่อนเริ่มโปรเจค ทีมจะต้องทำการศึกษาและทำความเข้าใจขอบเขตงาน และสรุปแผนการทำงานในทุกขั้นตอนให้กับผู้ที่เกี่ยวข้องทุกคน ทั้งภายในทีม Dev และกับเจ้าของโครงการ (Conclusion of brief)
  • ทีม Business Analysis จะทำ Research ข้อมูลเพื่อวิเคราะห์ความต้องการของธุรกิจ กระบวนการทางธุรกิจ ตลอดจนปัญหาและพฤติกรรมของผู้ใช้งานกลุ่มเป้าหมาย จากนั้นจึงนำมาสร้างเป็นแผนที่ประสบการณ์ของผู้ใช้ (User Journey Map) ซี่งขั้นตอนนี้ จะช่วยให้ทีม Dev เข้าใจถึงสภาพแวดล้อมของระบบ ลักษณะของผู้ใช้งาน ปัญหาที่รอการแก้ไข และแนวทางที่จะออกแบบระบบเพื่อตอบโจทย์เหล่านั้น
  • จากนั้น ทีม UX Designer จะลงมือสร้างแบบจำลองที่เสมือนจริง (Prototyping) สำหรับการสร้างซอฟต์แวร์แล้วขั้นตอนนี้ถือว่ามีความสำคัญมาก เพราะจะช่วยให้ทั้งผู้ใช้งานและนักพัฒนาเห็นในสิ่งเดียวกัน ได้ทดลองใช้งานหน้าจอใกล้เคียงกับซอฟต์แวร์ของจริง ซึ่งการออกแบบ Wireframe ที่ละเอียดครบทุก Flow นี้จะเป็นเสมือนพิมพ์เขียวให้ทีม Dev ทำงานได้อย่างมีประสิทธิภาพ และช่วยลดปัญหาความคลาดเคลื่อนในการสื่อสารของทีม Dev กับเจ้าของโครงการ รวมถึงผู้ใช้งานกลุ่มเป้าหมายด้วย
  • จากนั้นจึงเข้าสู่ กระบวนการออกแบบ UI Design (User Interface Design) ซึ่งเป็นการออกแบบรูปร่างหน้าตา ตลอดจนการตกแต่งด้วยสีสันให้กับโปรแกรม เพื่อให้โปรแกรมระบบมีความสวยงามน่าใช้ ซึ่งรวมถึงการออกแบบสีสันของปุ่มต่างๆ เพื่อสื่อสารกับผู้ใช้ เพื่อให้สังเกตเห็นและจดจำได้ง่าย และดำเนินการไปในทิศทางที่ผู้ออกแบบต้องการ การออกแบบกราฟฟิกเหล่านี้ทีมออกแบบยังจำเป็นต้องออกแบบองค์ประกอบต่างๆ ให้มีความสอดคล้องกับอัตลักษณ์ธุรกิจ (Corporate Identity) อีกด้วย
  • จากแบบจำลองหรือ Wireframe ที่ถูกออกแบบและผ่านการทดสอบโดยผู้ใช้ดังที่กล่าวมาแล้วนั้น ทีมโปรแกรมเมอร์จะนำไปเขียนโค้ดเพื่อสร้างเป็นชิ้นงานจริง ซึ่งขั้นตอนนี้ทีม UX จะต้องทำงานใกล้ชิดกับทีม Dev เพื่อช่วยอธิบายถึงรายละเอียดปลีกย่อยของการออกแบบ รวมถึงช่วยแก้ปัญหาและประสานกับเจ้าของโครงการ เพื่อนำข้อเสนอแนะต่างๆ ที่เกิดขึ้นระหว่างการทำงานของทีม Dev มาใช้ปรับปรุงแบบจำลองหรือ Wireframe ให้มีความเหมาะสมมากยิ่งขึ้น ในขณะเดียวกันทีมโปรแกรมเมอร์ก็ต้องยึดถือแบบจำลองนี้เป็นแนวทางในการเขียนโค้ด เพื่อให้ระบบสามารถใช้งานได้ตามที่ทีมตกลงไว้กับเจ้าของโครงการ
  • มาถึงขั้นตอนจัดเตรียมข้อมูลเพื่อที่จะเชื่อมโยงมาแสดงผลในโปรแกรมระบบ ซึ่งบางโปรแกรมอาจจะใช้ข้อมูลจากฐานข้อมูลเดียวบนระบบของตัวเอง แต่สำหรับโปรแกรมระบบที่มีความซับซ้อนมากๆ ทีม Dev จะต้องทำการสร้าง API (Application Program Interface) ขึ้นใช้งานร่วมกับฐานข้อมูลที่มาจากโปรแกรมระบบอื่นๆ นอกจากนั้น การจัดทำเนื้อหา รูปภาพประกอบ ข้อความ การแจ้งเตือน และคำอธิบายต่างๆ ทั้งหมดที่จะนำแสดงผลในหน้าจอของซอฟต์แวร์ระบบ ข้อมูลเหล่านี้จะช่วยในการสื่อสารระหว่างตัวโปรแกรมกับผู้ใช้งานได้อย่างมีประสิทธิภาพ
  • ก่อนที่จะมาถึงขั้นตอนไฮไลท์ของบทความนี้ ซึ่งก็คือกระบวนการทดสอบซอฟต์แวร์ หรือ Software Testing Process เป็นการตรวจสอบทั้งความถูกต้องของฟังก์ชั่นการทำงาน ความถูกต้องของข้อมูล รวมถึงประสิทธิภาพของโปรแกรมระบบก่อนนำโปรแกรมระบบไปใช้งานจริง ขั้นตอนนี้จะช่วยลดความเสี่ยงที่จะเกิดปัญหาต่างๆ ทั้งข้อผิดพลาดทั่วไปที่พบเห็นด้วยตาจนไปถึงจากการเขียนโค้ดที่ไม่รอบครอบ และข้อผิดพลาดที่เกิดจากการเชื่อมโยงข้อมูลที่ไม่ได้มาตรฐาน ซึ่งรวมถึงการเขียนโค้ดที่ไม่ดีพอและส่งผลต่อประสิทธิภาพโดยรวมของโปรแกรมระบบเมื่อมีการใช้งานในฟังก์ชั่นดังกล่าว โดยขั้นตอนนี้จะต้องดำเนินการบนเครื่อง server ที่มีประสิทธิภาพและสภาพแวดล้อมใกล้เคียงกับเครื่อง Production เพื่อให้ได้ข้อมูลที่มีความถูกต้องที่สุด
  • เมื่อโปรแกรมระบบที่พัฒนาขึ้นผ่านกระบวนการทดสอบซอฟต์แวร์ – Software Testing Process แล้ว ทางทีม Dev จะดำเนินการติดตั้งบนเครื่อง Production เพื่อเปิดใช้งานจริงต่อไป
  • หลังจากติดตั้งและส่งมอบโปรแกรมระบบให้แก่เจ้าของโครงการแล้ว ทีมจะต้องคอยมอนิเตอร์ Log file อยู่เสมอเพื่อป้องกันไม่ให้เกิดปัญหาจากการใช้งาน หรือหากพบว่าโปรแกรมระบบมีข้อผิดพลาดเกิดขึ้นก็จะสามารถเข้าไปช่วยสนับสนุนเจ้าของโครงการได้อย่างทันท่วงที

ต่อไปเราลองมาดูรายละเอียดต่างๆ ของการทดสอบซอฟต์แวร์ – Software Testing Process กันเลยดีกว่า

Software Testing Process ตามแบบฉบับ “ทีเอ็นที” มีดังนี้



โดยจะเริ่มทดสอบในแต่ละขั้นตอนจนกว่าจะผ่าน เพื่อให้ได้ผลลัพธ์ที่ถูกต้องที่สุดนั่นเอง เรามาดูรายละเอียดกันเลย


การทดสอบความถูกต้องของลิงก์ : Shakedown Test

การทดสอบความถูกต้องของลิงก์ : Shakedown Test

การทดสอบตาม Logic ของระบบ โดย Tester จะคลิกทดสอบดูเรื่องความถูกต้องของปุ่มและลิงก์ เพื่อให้แน่นใจว่าไม่มีส่วนไหนค้าง หรือขึ้น Error และจากนั้นต้องตรวจสอบว่า Flow ของระบบถูกต้องตาม Wireframe หรือไม่ ในกรณีที่เกิดข้อผิดพลาด ผู้ตรวจสอบจะต้องทำการจดบันทึก เพื่อแจ้งให้ทางทีม Dev. ทำการปรับปรุงแก้ไขก่อนเข้าสู่การทดสอบในขั้นตอนต่อไป


การทดสอบฟังก์ชั่นการทำงาน: Unit Testing

การทดสอบฟังก์ชั่นการทำงาน: Unit Testing

การทดสอบการทำงานของซอฟต์แวร์ในแต่ละหน่วยโดยไม่สนใจ Service ตัวอื่น ซึ่งคำว่าหน่วย ก็คือ ฟังก์ชั่น (function) การทำงานที่เล็กที่สุดที่สามารถทดสอบได้ ในที่นี่อาจหมายถึง class ก็ได้

การทดสอบด้วย Unit testing ส่วนใหญ่โปรแกรมเมอร์จะเป็นผู้ทำการทดสอบในส่วนนี้ โดยตรวจสอบว่า Input / Output ตรงกับที่ออกแบบไว้หรือไม่ หากทำ Unit testing ที่ได้มาตรฐานจะช่วยลดข้อผิดพลาดที่เกิดจากการเขียนโค้ดได้ รวมถึงสามารถทำให้แน่ใจว่าการทำงานของแต่ละส่วนสามารถทำงานได้อย่างถูกต้อง

Unit testing ที่ดีต้องมีอะไรบ้าง

  • ครอบคลุมการทำงานที่สำคัญในทุกฟังก์ชัน
  • ควรจะทำงานแบบอัตโนมัติและทำซ้ำได้
  • ทำงานได้เร็ว
  • ใช้งานง่าย ทุกคนควรจะสามารถใช้งานมันได้
  • มีความน่าเชื่อถือ

เทคนิคการทำ Unit testing

  • หาเครื่องมือ หรือ Framework สำหรับภาษาที่พัฒนา
  • ไม่จำเป็นต้องสร้าง Unit testing ทุกหน่วย แต่มุ่งเน้นส่วนที่มีผลกระทบต่อระบบ
  • ใช้ข้อมูลทดสอบที่มีความใกล้เคียงกับการใช้งานจริง
  • ครอบคลุมทุกเส้นทางการทำงานส่วนที่เป็นเงื่อนไขและวนลูป
  • ดำเนินการอย่างต่อเนื่องและสม่ำเสมอ


การทดสอบการเชื่อมต่อกับ Service อื่นๆ : SIT (System Integration Test)

การทดสอบการเชื่อมต่อกับ Service อื่นๆ : SIT (System Integration Test)

การทดสอบเพื่อตรวจสอบว่าระบบต่างๆ สามารถทำงานร่วมกันได้อย่างถูกต้อง ตรงตามวัตถุประสงค์ ทั้ง Network Integration และ Product Integration ซึ่งจะรวมไปถึง Infrastructure ของระบบ

โดยการนำ Service ทุกตัวมารันที่ Server จริง และตรวจสอบให้มั่นใจว่า Service ต่างๆ จะต้องทำงานได้ดี สามารถเชื่อมต่อกับ Network, Database, Service อื่นๆ รวมถึง Party ต่าง ๆ ที่ทีมพัฒนาขึ้นมาได้อย่างถูกต้อง


การทดสอบเพื่อวัดผลตอบรับจากผู้ใช้งาน : UAT (User Acceptance Test)

การทดสอบเพื่อวัดผลตอบรับจากผู้ใช้งาน : UAT (User Acceptance Test)

กระบวนการทดสอบระบบ – Software Testing Process นี้ ทีมจะให้เจ้าของโครงการจะทำการทดสอบบนเครื่อง UAT ก่อนการนำไปติดตั้งบนเครื่อง Production สำหรับการใช้งานจริง เพื่อตรวจสอบว่าตรงกับความต้องการของลูกค้า (Requirement) และตรงตาม Business Flow จริงๆ ของธุรกิจในระดับที่ยอมรับได้หรือไม่ ซึ่งได้ร่วมกันกำหนดขึ้นมาระหว่างธุรกิจ กับทีมที่พัฒนาระบบ รวมถึงส่วนงานอื่นๆ ที่เกี่ยวข้อง โดยจะทดสอบในสภาพแวดล้อม (Environment) ที่ใกล้เคียงกับการใช้งานจริง (Production) มากที่สุด

สำหรับการทดสอบในขั้นตอนนี้ แตกต่างจากขั้นตอนอื่นๆ คือ ผู้ใช้งานระบบจริงจะต้องเข้ามามีส่วนร่วมในกระบวนการทดสอบซอฟต์แวร์โดยเริ่มตั้งแต่ กำหนดกรณีทดสอบ (Test Case / Scenario) จนถึงการประเมินและสรุปผลการทดสอบ (UAT Result and Evaluation) และตัดสินใจว่าระบบดังกล่าวจะสามารถนำไปใช้งานจริงได้หรือไม่ ถ้าได้ก็จะมีการลงนามอนุมัติจากเจ้าของโครงการเป็นลายลักษณ์อักษร (UAT Sign Off) เพื่ออนุญาตให้นำระบบไปใช้งานจริง แต่ถ้าใช้งานไม่ได้หรือไม่ตรงตามที่ตกลง ระบบจะถูกนำไปปรับปรุงแก้ไข แล้วจะกลับเข้าสู่กระบวนการ UAT ใหม่อีกครั้งจนกว่าจะผ่าน


การทดสอบประสิทธิภาพการทำงานของระบบ : NFT (Non Functional Test)

การทดสอบประสิทธิภาพการทำงานของระบบ : NFT (Non Function Test)

เราจะทำการทำการทดสอบประสิทธิภาพการทำงาน เพื่อประเมินความพร้อมของระบบ ก่อนที่จะนำไปใช้งานจริง ทั้งนี้ขึ้นอยู่กับเกณฑ์การพิจารณาของแต่ละโปรเจค ซึ่งการทดสอบซอฟต์แวร์ – Software Testing ในขั้นตอนนี้จะไม่คำนึงถึงความถูกต้องของฟังก์ชั่นการใช้งานต่างๆ ภายในระบบ แต่จะวัดประเมินผลเปรียบเทียบว่าระบบจะสามารถรองรับการทำงานหนักได้หรือไม่ และซอฟต์แวร์ระบบที่ถูกพัฒนาขึ้นมาจะมีการตอบสนองเป็นอย่างไร เป็นต้น

NFT สามารถแบ่งตาม scenario ของแต่ละระบบโดยจะยึดตามเกณฑ์อะไรสำคัญ เช่น

  • Load Testing คือ process สำหรับการวัด response time ในการทำงานของระบบที่อยู่ภาพใต้การใช้งานรูปแบบต่างๆ
  • Stress Testing คือ การทดสอบความอึด ความอดทน ความสามารถรับวิกฤตและความท้าทายในรูปแบบต่างๆ ที่อาจเกิดขึ้น
  • Spike Testing คือ การทดสอบปริมาณการใช้งานแบบเพิ่มขึ้นอย่างรวดเร็ว (Spike Traffic)
  • Soak Testing หรือ Endurance Testing คือ การทดสอบการใช้งานของระบบ ในกรณีที่ใช้งานเป็นเวลานานๆ ว่ามีการตอบสนอง (Response Times) ต่อปริมาณงานที่ประมวลผลได้ (Throughput) เหมือนกับตอนเริ่มต้นหรือไม่
  • Capacity Testing คือ การทดสอบความจุของระบบ ว่าสามารถรองรับผู้ใช้ได้มากสุดกี่คน โดยที่ระบบยังสามารถใช้งานได้อย่างปกติ
  • Recovery Testing คือ การทดสอบการตอบสนองของระบบกรณีเกิดข้อผิดพลาด การสูญหายของข้อมูล เพื่อให้เห็นว่าระบบสามารถกู้คืนได้อย่างถูกต้อง
  • Smoke Testing มักรู้จักกันในชื่อ "Build Verification Testing" ซึ่งเป็นการ Test ครอบคลุมเฉพาะ Function หลักๆ ไม่ได้ลงลึกอะไรมากมาย ผลของการ Test ขั้นนี้ จะใช้เพื่อตัดสินใจว่าจะดำเนินการ Test ในขั้นต่อไปหรือไม่เท่านั้นเอง เรียกง่ายๆ ว่าถ้า Smoke Tests ผ่าน ก็ไปสู่การ Test อื่นๆ ต่อไปได้เลย แต่ถ้าเจอปัญหาก็ต้องหยุด เพื่อหา Bug ให้เจอว่าสาเหตุเกิดจากอะไร เกิดที่จุดไหน และแก้ไขให้เรียบร้อยเสียก่อน
  • Volume Testing คือ การทดสอบปริมาณของข้อมูลที่มากที่สุด ที่ระบบสามารถจัดการได้้
  • Network Sensitivity Testing คือ การทดสอบการทำงานของเครือข่าย (network) เช็คเรื่องขีดจำกัดของการเชื่อมต่อ WAN และปัจจัยต่างๆ ที่ส่งผลกระทบต่อปริมาณการรับ-ส่งข้อมูลของอินเตอร์เน็ต (bandwidth) หรือไม่
  • Scalability Testing คือ การทดสอบเพื่อวัดความสามารถในการประยุกต์ใช้เมื่อนำไปใช้กับระบบที่ใหญ่ขึ้น หรือ ระบบอื่นๆ ที่จะทำไปใช้้

ทำไมจะต้องเสียเวลาในการทำ Software Testing เยอะขนาดนี้ แล้วจะคุ้มหรือไม่?

ตอบได้เลยว่าคุ้มค่ามากจริงๆ หากเปรียบเทียบเวลาที่ต้องเสียไปกับการทดสอบ กับผลตอบรับที่ดีของผู้ใช้งาน ซี่งทุกคนสามารถใช้งานระบบได้อย่างถูกต้องแม่นยำ มีความรวดเร็วในการตอบสนอง และสามารถตอบโจทย์ได้ทุกการใช้งาน นั่นจะเป็นปัจจัยสำคัญ ที่ช่วยให้โครงการมีโอกาสประสบความสำเร็จมากขึ้น คุ้มค่ากับการลงทุน

ดังนั้น นี่คือ เคล็ดลับอันสำคัญยิ่ง ที่จะช่วยให้ซอฟต์แวร์ระบบใดๆ ที่ให้ประสบความสำเร็จ จึงจำเป็นอย่างมาก ที่จะต้องผ่านกระบวนการทดสอบซอฟต์แวร์ – Software Testing Process ที่ได้มาตรฐาน ทุกครั้ง ทุกขั้นตอน ก่อนที่จะถึงมือผู้ใช้จริง เพราะการที่ธุรกิจจะต้องมานั่งตอบคำถามผู้ใช้กับข้อผิดพลาดที่เกิดขึ้น รวมถึงการสร้างประสบการณ์ที่ไม่ดีให้แก่ผู้ใช้และทำให้พวกเขาเกิดความไม่ไว้วางใจในระบบรวมถึงตัวองค์กรแล้วไซร้

การที่จะกู้กลับมาแก้ไขภายหลังเป็นเรื่องที่ยากยิ่ง ในเมื่อเรายังมีโอกาสที่จะหยุดความผิดพลาดเหล่านั้นได้ด้วยการหันมาใส่ใจในกระบวนการทดสอบโปรแกรมระบบที่มีมาตรฐานอย่างรอบครอบก่อนจะปล่อยให้มันกลายเป็นภาระปัญหาของธุรกิจแล้วนั้น อย่าว่าแต่ความฝันถึงความสำเร็จแบบลมๆแร้งๆ เลย มันอาจเป็นการลงทุนสร้างระเบิดเวลาฆ่าตัวตายก็เป็นได้นะจ๊ะ

« Back to Result