การทดสอบโมดูลคืออะไร? คำจำกัดความ ตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

การทดสอบแบบโมดูลจะตรวจสอบโปรแกรมย่อย รูทีนย่อย คลาส และขั้นตอนการทำงานแต่ละรายการ แทนที่จะตรวจสอบโปรแกรมที่ประกอบเสร็จแล้ว ดังนั้นข้อบกพร่องจึงปรากฏขึ้นภายในบล็อกโค้ดขนาดเล็กที่เข้าใจได้ง่าย ซึ่งทำให้การค้นหาและแก้ไขข้อบกพร่องนั้นมีต้นทุนต่ำ

  • 🎯 วัตถุประสงค์: เป้าหมายคือการเปิดเผยข้อผิดพลาดในโมดูล ไม่ใช่การแสดงให้เห็นว่าโมดูลนั้นทำงานได้
  • ⚪ ปฐมนิเทศ: เทคนิคนี้ส่วนใหญ่เป็นแบบกล่องขาว (white box) เสริมด้วยกรณีศึกษาแบบกล่องดำ (black box) ที่ดึงมาจากข้อกำหนด
  • ⏩ parallelism: สามารถทดสอบหลายโมดูลพร้อมกันได้ ซึ่งจะช่วยลดระยะเวลาการทดสอบโดยรวมลง
  • 🔗 สองวิธี: โมดูลต่างๆ จะถูกรวมเข้าด้วยกันได้ทั้งแบบเพิ่มทีละขั้น แบบทีละขั้นตอน หรือแบบไม่เพิ่มทีละขั้นในครั้งเดียว
  • 🧰 นั่งร้าน: ไดรเวอร์จะส่งข้อมูลทดสอบไปยังโมดูล ในขณะที่สตับจะทำหน้าที่แทนโมดูลที่ไดรเวอร์เรียกใช้
  • 🆚 เจ้าของ: ผู้ทดสอบจะเขียนการทดสอบโมดูลหลังจากเขียนโค้ดเสร็จ ในขณะที่นักพัฒนาจะเขียนการทดสอบหน่วยในระหว่างการพัฒนา
  • ⚠️ ความท้าทาย: งานที่ไม่เป็นไปทีละขั้น โมเดลทดสอบที่เข้าใจผิด และการแก้ไขข้อผิดพลาดบ่อยครั้ง ทำให้เสียเวลาและความพยายามไปมาก

คำอธิบายเกี่ยวกับการทดสอบโมดูล พร้อมวิธีการ ตัวขับเคลื่อน สตับ และการเปรียบเทียบ

การทดสอบโมดูลคืออะไร?

การทดสอบโมดูล การทดสอบแบบโมดูลเป็นการทดสอบซอฟต์แวร์ประเภทหนึ่งที่ตรวจสอบโปรแกรมย่อย รูทีนย่อย คลาส หรือขั้นตอนการทำงานแต่ละส่วนในโปรแกรม แทนที่จะทดสอบโปรแกรมซอฟต์แวร์ทั้งหมดในคราวเดียว การทดสอบแบบโมดูลแนะนำให้ทดสอบส่วนประกอบย่อยๆ ของโปรแกรม

การทดสอบโมดูลส่วนใหญ่มุ่งเน้นไปที่การทดสอบแบบกล่องขาว (white box testing) วัตถุประสงค์ของการทดสอบโมดูลไม่ใช่เพื่อแสดงให้เห็นว่าโมดูลทำงานได้อย่างถูกต้อง แต่เพื่อแสดงให้เห็นว่ามีข้อผิดพลาดอยู่ในโมดูลนั้น การกลับด้านนี้มีความสำคัญ: การทดสอบที่ไม่พบอะไรเลยนั้นยืนยันอะไรได้น้อยมาก ในขณะที่การทดสอบที่เปิดเผยข้อบกพร่องนั้นได้ทำหน้าที่ของมันแล้ว

การทดสอบในระดับโมดูลยังช่วยให้สามารถนำหลักการทำงานแบบขนานมาใช้ในกระบวนการทดสอบได้ เนื่องจากเป็นการเปิดโอกาสให้ทดสอบหลายโมดูลพร้อมกัน แทนที่จะรอให้การสร้างระบบเสร็จสมบูรณ์

ทำไมต้องทำ Module Test

แนะนำให้ทำการทดสอบโมดูล เนื่องจากจะช่วยเปลี่ยนแปลงต้นทุนในการตรวจหาข้อบกพร่อง

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

การทดสอบโมดูลทำอย่างไร?

การออกแบบไฟล์ กรณีทดสอบ การออกแบบกรณีทดสอบสำหรับการทดสอบโมดูลเป็นส่วนสำคัญ ในการออกแบบกรณีทดสอบสำหรับการทดสอบโมดูล ผู้ทดสอบต้องคำนึงถึงสองสิ่งต่อไปนี้

  • ข้อกำหนดสำหรับโมดูล
  • ซอร์สโค้ดของโมดูล

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

เมื่อออกแบบกรณีทดสอบเสร็จแล้ว ขั้นตอนต่อไปคือการรวมโมดูลสำหรับการทดสอบ วิธีที่ใช้คืออย่างใดอย่างหนึ่งต่อไปนี้ ที่เพิ่มขึ้น หรือ ไม่ใช่แบบเพิ่มขึ้นทีละน้อย วิธี

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

การเลือกใช้วิธีใดวิธีหนึ่งระหว่างสองวิธีนี้ เป็นการแลกเปลี่ยนระหว่างความยุ่งยากในการติดตั้งและความสามารถในการวินิจฉัยปัญหา

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

ไดรเวอร์และสตับในการทดสอบโมดูล

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

  • คนขับรถ — ทำหน้าที่แทนที่โมดูลที่เรียกใช้งานอยู่เหนือโมดูลที่กำลังทดสอบ โดยจะส่งข้อมูลทดสอบ เรียกใช้โมดูล ตรวจสอบการทำงาน และบันทึกผลลัพธ์ การทดสอบแบบจากล่างขึ้นบนขึ้นอยู่กับตัวขับเคลื่อน เนื่องจากโมดูลระดับล่างจะพร้อมใช้งานก่อนโมดูลระดับบน
  • ต้นขั้ว — แทนที่โมดูลที่ถูกเรียกซึ่งอยู่ด้านล่างโมดูลที่กำลังทดสอบ โดยจะรับการเรียกและส่งคืนค่าตอบสนองที่กำหนดไว้และทราบแล้ว เพื่อให้โมดูลที่กำลังทดสอบสามารถดำเนินการต่อไปได้ การทดสอบแบบบนลงล่างขึ้นอยู่กับสตับ (stub) เนื่องจากโมดูลระดับสูงกว่าจะพร้อมใช้งานก่อน

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

ตัวอย่างเคล็ดลับสำหรับการทดสอบโมดูล

ต่อไปนี้เป็นคำแนะนำบางประการที่ควรพิจารณาก่อนทำการทดสอบโมดูล

  • Revตรวจสอบกรณีทดสอบก่อนใช้งาน
  • หลีกเลี่ยงความสับสนเกี่ยวกับที่มาของความคลาดเคลื่อน
  • ใช้เครื่องมือทดสอบอัตโนมัติ
  • ตรวจสอบตัวแปรที่ควรคงเดิม
  • สลับโมดูลระหว่างเครื่องทดสอบเพื่อหลีกเลี่ยงการทดสอบตัวเอง
  • นำกรณีทดสอบกลับมาใช้ใหม่

เคล็ดลับข้อที่ห้ามีความสำคัญมากกว่าที่ความยาวของมันบ่งบอก นักพัฒนาที่ทดสอบเฉพาะโมดูลที่เพิ่งเขียนเสร็จจะทำซ้ำสมมติฐานเดิมที่ทำให้เกิดข้อบกพร่อง ดังนั้นการหมุนเวียนโมดูลระหว่างบุคคลจึงเป็นหนึ่งในวิธีเพิ่มคุณภาพที่ประหยัดที่สุดวิธีหนึ่ง

การทดสอบหน่วยเทียบกับการทดสอบโมดูล

ในหลายทีมมักใช้สองคำนี้สลับกันไปมา แต่ผู้เขียนและขอบเขตงานนั้นแตกต่างกัน

การทดสอบโมดูล การทดสอบหน่วย
การทดสอบโมดูลคือชุดของการทดสอบที่เขียนโดยผู้ทดสอบหลังจากที่นักพัฒนาเขียนโค้ดบางส่วนแล้ว การทดสอบหน่วย คือชุดของการทดสอบที่เขียนขึ้นโดยนักพัฒนาซอฟต์แวร์ในระหว่างกระบวนการพัฒนาซอฟต์แวร์
การทดสอบโมดูลอาจเกี่ยวข้องกับการรวมการทดสอบหน่วยเข้าด้วยกัน การทดสอบหน่วยอาจทดสอบหน่วยต่างๆ แยกกัน

การทดสอบโมดูล เทียบกับ การทดสอบส่วนประกอบ เทียบกับ การทดสอบการบูรณาการ

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

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

ในการใช้งานทั่วไป การทดสอบส่วนประกอบ และการทดสอบโมดูลมักถูกมองว่าเป็นกิจกรรมเดียวกัน ในขณะที่ การทดสอบการรวม จะเริ่มต้นก็ต่อเมื่อแต่ละโมดูลผ่านการทดสอบแล้วเท่านั้น

ความท้าทายในการทดสอบโมดูล

นี่คือความท้าทายที่ทีมต่างๆ พบเจอบ่อยที่สุดเมื่อนำการทดสอบโมดูลมาใช้

  • การทดสอบแบบไม่เพิ่มขึ้นต้องอาศัยการทำงานมากขึ้น — การรวมทุกอย่างเข้าด้วยกันก่อน หมายความว่าหากเกิดข้อผิดพลาดเพียงครั้งเดียว ผู้ทดสอบอาจต้องกลับไปทำโปรแกรมทั้งหมดใหม่อีกครั้ง
  • การทดสอบความเข้าใจผิดทวีคูณ — คำสั่ง stub ที่ให้ค่าที่ไม่สมจริงจะทำให้ได้ผลลัพธ์เป็นสีเขียว ซึ่งไม่ได้พิสูจน์อะไรเลย
  • การทดสอบการแก้ไขข้อผิดพลาดมักจะ — โค้ดโครงสร้างพื้นฐานมีข้อบกพร่องในตัวของมันเอง และเวลาที่ใช้ในการแก้ไขไดรเวอร์ก็คือเวลาที่ไม่ได้ใช้ในการทดสอบโมดูล
  • จำเป็นต้องเข้าใจโค้ด — การออกแบบแบบกล่องขาวหมายความว่า ผู้ทดสอบที่ไม่สามารถอ่านโมดูลได้ จะไม่สามารถออกแบบกรณีทดสอบที่มีความหมายสำหรับโมดูลนั้นได้

คำถามที่พบบ่อย

ตระกูล xUnit ครอบคลุมภาษาโปรแกรมส่วนใหญ่ โดยมีไลบรารีสำหรับการจำลอง (mocking libraries) ที่จัดเตรียมข้อมูลจำลอง (stubs) และเครื่องมือวัดความครอบคลุม (coverage tool) ที่แสดงให้เห็นว่าเส้นทางใดบ้างที่ถูกเรียกใช้งาน การเลือกใช้ขึ้นอยู่กับภาษาของโมดูล ไม่ใช่ระดับการทดสอบ

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

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

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

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

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

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

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

สรุปโพสต์นี้ด้วย: