การทดสอบหน่วยคืออะไร?
การทดสอบหน่วยคืออะไร?
การทดสอบหน่วย คือการทดสอบซอฟต์แวร์ประเภทหนึ่งที่มีการทดสอบแต่ละหน่วยหรือส่วนประกอบของซอฟต์แวร์ วัตถุประสงค์คือเพื่อตรวจสอบความถูกต้องว่าแต่ละหน่วยของรหัสซอฟต์แวร์ทำงานตามที่คาดไว้ การทดสอบหน่วยเสร็จสิ้นในระหว่างการพัฒนา (ขั้นตอนการเขียนโค้ด) ของแอปพลิเคชันโดยนักพัฒนา Unit Tests แยกส่วนของโค้ดและตรวจสอบความถูกต้อง หน่วยอาจเป็นฟังก์ชัน วิธีการ ขั้นตอน โมดูล หรือวัตถุแต่ละรายการก็ได้
ใน SDLC, STLC, V Model การทดสอบหน่วยเป็นการทดสอบระดับแรกที่ดำเนินการก่อนการทดสอบบูรณาการ การทดสอบหน่วยเป็นสีขาวBox เทคนิคการทดสอบที่นักพัฒนามักจะทำ แม้ว่าในโลกแห่งความเป็นจริงเนื่องจากปัญหาด้านเวลาหรือไม่เต็มใจของนักพัฒนาในการทดสอบ วิศวกร QA ก็ยังทำการทดสอบหน่วยด้วย
คำอธิบายวิดีโอการทดสอบหน่วย
ทำไมต้องทำการทดสอบหน่วย?
การทดสอบหน่วย เป็นสิ่งสำคัญเนื่องจากนักพัฒนาซอฟต์แวร์บางครั้งพยายามประหยัดเวลาในการทดสอบหน่วยน้อยที่สุด และนี่คือความเชื่อผิด ๆ เนื่องจากการทดสอบหน่วยที่ไม่เหมาะสมทำให้เกิดค่าใช้จ่ายสูง ข้อบกพร่อง แก้ไขในระหว่าง การทดสอบระบบ, การทดสอบการผสานรวม และแม้แต่การทดสอบเบต้าหลังจากสร้างแอปพลิเคชันแล้ว หากทำการทดสอบหน่วยที่เหมาะสมในช่วงเริ่มต้นของการพัฒนา ก็จะช่วยประหยัดเวลาและเงินได้ในที่สุด
ต่อไปนี้เป็นเหตุผลสำคัญในการดำเนินการทดสอบหน่วยในวิศวกรรมซอฟต์แวร์:
- การทดสอบหน่วยช่วยแก้ไขข้อบกพร่องตั้งแต่เนิ่นๆ ของวงจรการพัฒนาและประหยัดค่าใช้จ่าย
- ช่วยให้นักพัฒนาเข้าใจฐานโค้ดการทดสอบและช่วยให้ทำการเปลี่ยนแปลงได้อย่างรวดเร็ว
- การทดสอบหน่วยที่ดีทำหน้าที่เป็นเอกสารประกอบโครงการ
- การทดสอบหน่วยช่วยในการนำโค้ดกลับมาใช้ใหม่ ย้ายรหัสของคุณทั้งสอง และ การทดสอบของคุณกับโครงการใหม่ของคุณ ปรับแต่งโค้ดจนกว่าการทดสอบจะทำงานอีกครั้ง
วิธีดำเนินการทดสอบหน่วย
เพื่อดำเนินการทดสอบหน่วย นักพัฒนาเขียนส่วนของโค้ดเพื่อทดสอบฟังก์ชันเฉพาะในแอปพลิเคชันซอฟต์แวร์ นักพัฒนายังสามารถแยกฟังก์ชันนี้ออกเพื่อทดสอบที่เข้มงวดมากขึ้น ซึ่งเผยให้เห็นการพึ่งพาที่ไม่จำเป็นระหว่างฟังก์ชันที่กำลังทดสอบกับหน่วยอื่นๆ เพื่อให้สามารถขจัดการพึ่งพาได้ นักพัฒนามักใช้ กรอบการทดสอบหน่วย เพื่อพัฒนากรณีทดสอบอัตโนมัติสำหรับการทดสอบหน่วย
การทดสอบหน่วยมีสองประเภท
- ด้วยมือ
- อัตโนมัติ
โดยทั่วไปการทดสอบหน่วยจะเป็นไปโดยอัตโนมัติ แต่อาจยังคงดำเนินการด้วยตนเอง วิศวกรรมซอฟต์แวร์ไม่ชอบสิ่งหนึ่งสิ่งใด แต่ระบบอัตโนมัติเป็นที่ต้องการมากกว่า แนวทางการทดสอบหน่วยด้วยตนเองอาจใช้เอกสารคำแนะนำทีละขั้นตอน
ภายใต้แนวทางอัตโนมัติ-
- นักพัฒนาเขียนโค้ดบางส่วนในแอปพลิเคชันเพื่อทดสอบฟังก์ชันเท่านั้น ต่อมาพวกเขาจะใส่เครื่องหมายคอมเมนต์และลบโค้ดทดสอบออกเมื่อแอปพลิเคชันถูกปรับใช้
- นักพัฒนายังสามารถแยกฟังก์ชันเพื่อทดสอบได้เข้มงวดมากขึ้น นี่เป็นแนวทางปฏิบัติในการทดสอบหน่วยที่ละเอียดยิ่งขึ้น ซึ่งเกี่ยวข้องกับการคัดลอกและวางโค้ดไปยังสภาพแวดล้อมการทดสอบของตัวเองมากกว่าสภาพแวดล้อมตามธรรมชาติ การแยกโค้ดช่วยในการเปิดเผยการขึ้นต่อกันที่ไม่จำเป็นระหว่างโค้ดที่กำลังทดสอบกับหน่วยอื่นๆ หรือพื้นที่ข้อมูล ในผลิตภัณฑ์ การพึ่งพาเหล่านี้สามารถกำจัดได้
- โดยทั่วไปผู้เขียนโค้ดจะใช้ UnitTest Framework เพื่อพัฒนากรณีทดสอบอัตโนมัติ การใช้กรอบงานอัตโนมัติ นักพัฒนากำหนดเกณฑ์ในการทดสอบเพื่อตรวจสอบความถูกต้องของโค้ด ในระหว่างการดำเนินการกรณีทดสอบ กรอบงานบันทึกกรณีทดสอบที่ล้มเหลว เฟรมเวิร์กจำนวนมากจะตั้งค่าสถานะและรายงานสิ่งเหล่านี้โดยอัตโนมัติ กรณีทดสอบที่ล้มเหลว- กรอบงานอาจหยุดการทดสอบในภายหลัง ทั้งนี้ขึ้นอยู่กับความรุนแรงของความล้มเหลว
- ขั้นตอนการทำงานของ Unit Testing คือ 1) สร้าง Test Cases 2) Review/Rework 3) พื้นฐาน 4) ดำเนินการกรณีทดสอบ
เทคนิคการทดสอบหน่วย
เทศกาล เทคนิคการทดสอบหน่วย แบ่งออกเป็น 3 ส่วนหลักๆ ได้แก่ การทดสอบกล่องดำ ซึ่งเกี่ยวข้องกับการทดสอบอินเทอร์เฟซผู้ใช้ควบคู่ไปกับอินพุตและเอาต์พุต การทดสอบกล่องขาว ซึ่งเกี่ยวข้องกับการทดสอบพฤติกรรมการทำงานของแอปพลิเคชันซอฟต์แวร์ และการทดสอบกล่องสีเทา ซึ่งใช้ในการดำเนินการชุดการทดสอบ วิธีการทดสอบ กรณีทดสอบ และการดำเนินการวิเคราะห์ความเสี่ยง
เทคนิคการครอบคลุมโค้ดที่ใช้ในการทดสอบหน่วยมีดังต่อไปนี้:
- ความคุ้มครองคำชี้แจง
- ความคุ้มครองการตัดสินใจ
- ความคุ้มครองสาขา
- ความคุ้มครองสภาพ
- ความครอบคลุมของเครื่องจักรที่มีสถานะจำกัด
สำหรับข้อมูลเพิ่มเติมในการอ้างอิง https://www.guru99.com/code-coverage.html
ตัวอย่างการทดสอบหน่วย: วัตถุจำลอง
การทดสอบหน่วยอาศัยวัตถุจำลองที่ถูกสร้างขึ้นเพื่อทดสอบส่วนของโค้ดที่ยังไม่เป็นส่วนหนึ่งของแอปพลิเคชันที่สมบูรณ์ วัตถุจำลองจะเติมส่วนที่ขาดหายไปของโปรแกรม
ตัวอย่างเช่น คุณอาจมีฟังก์ชันที่ต้องการตัวแปรหรือออบเจ็กต์ที่ยังไม่ได้สร้าง ในการทดสอบหน่วย สิ่งเหล่านั้นจะถูกพิจารณาในรูปแบบของวัตถุจำลองที่สร้างขึ้นเพื่อวัตถุประสงค์ของการทดสอบหน่วยที่ทำในส่วนของโค้ดนั้นเท่านั้น
เครื่องมือทดสอบหน่วย
มีซอฟต์แวร์ทดสอบหน่วยอัตโนมัติหลายตัวที่พร้อมให้ความช่วยเหลือในการทดสอบหน่วยในการทดสอบซอฟต์แวร์ เราจะยกตัวอย่างด้านล่าง:
- จูนิต:Junit เป็นเครื่องมือทดสอบที่ใช้งานได้ฟรีสำหรับ Java ภาษาโปรแกรม ให้การยืนยันเพื่อระบุวิธีการทดสอบ เครื่องมือนี้ทดสอบข้อมูลก่อนแล้วจึงแทรกลงในส่วนของโค้ด
- หน่วย: NUnit เป็นเฟรมเวิร์กการทดสอบหน่วยที่ใช้กันอย่างแพร่หลายสำหรับภาษา .net ทั้งหมด เป็นเครื่องมือโอเพ่นซอร์สที่ช่วยให้เขียนสคริปต์ได้ด้วยตนเอง รองรับการทดสอบที่ขับเคลื่อนด้วยข้อมูลซึ่งสามารถทำงานแบบขนานได้
- เจม็อกกิต: JMockit เป็นเครื่องมือทดสอบหน่วยโอเพ่นซอร์ส เป็นเครื่องมือครอบคลุมโค้ดพร้อมเมตริกเส้นและเส้นทาง อนุญาตให้จำลอง API พร้อมไวยากรณ์การบันทึกและการตรวจสอบ เครื่องมือนี้นำเสนอความครอบคลุมของเส้น ความครอบคลุมของเส้นทาง และความครอบคลุมของข้อมูล
- EMMA: EMMA เป็นชุดเครื่องมือโอเพ่นซอร์สสำหรับการวิเคราะห์และรายงานโค้ดที่เขียน Java ภาษา. Emma รองรับประเภทความครอบคลุม เช่น วิธีการ เส้น บล็อกพื้นฐาน มันคือ Java- ดังนั้นจึงไม่มีการพึ่งพาไลบรารีภายนอกและสามารถเข้าถึงซอร์สโค้ดได้
- PHPUnit: PHPUnit เป็นเครื่องมือทดสอบหน่วยสำหรับโปรแกรมเมอร์ PHP ใช้โค้ดส่วนเล็กๆ ที่เรียกว่าหน่วยและทดสอบแต่ละส่วนแยกกัน เครื่องมือนี้ยังช่วยให้นักพัฒนาใช้วิธีการยืนยันที่กำหนดไว้ล่วงหน้าเพื่อยืนยันว่าระบบมีพฤติกรรมในลักษณะที่แน่นอน
นี่เป็นเพียงเครื่องมือทดสอบหน่วยบางส่วนที่มีอยู่ มีอีกมากมายโดยเฉพาะสำหรับ ภาษาซี และ Javaแต่คุณจะพบเครื่องมือทดสอบหน่วยสำหรับความต้องการในการเขียนโปรแกรมของคุณอย่างแน่นอน ไม่ว่าคุณจะใช้ภาษาใดก็ตาม
การพัฒนาการทดสอบการขับเคลื่อน (TDD) และการทดสอบหน่วย
การทดสอบหน่วยใน TDD เกี่ยวข้องกับการใช้กรอบการทดสอบอย่างกว้างขวาง กรอบการทดสอบหน่วยใช้เพื่อสร้างการทดสอบหน่วยแบบอัตโนมัติ กรอบการทดสอบหน่วยไม่ได้มีลักษณะเฉพาะสำหรับ TDD แต่มีความสำคัญต่อมัน ด้านล่างนี้เรามาดูสิ่งที่ TDD นำมาสู่โลกแห่งการทดสอบหน่วย:
- การทดสอบจะถูกเขียนก่อนโค้ด
- พึ่งพากรอบการทดสอบอย่างมาก
- คลาสทั้งหมดในแอปพลิเคชันได้รับการทดสอบ
- บูรณาการได้รวดเร็วและง่ายดาย
ตำนานการทดสอบหน่วย
ตำนาน: มันต้องใช้เวลาและฉันก็มักจะเกินกำหนดเวลาไว้เสมอ
รหัสของฉันแข็งแกร่งมาก! ฉันไม่ต้องการการทดสอบหน่วย
ตำนานโดยธรรมชาติแล้วถือเป็นสมมติฐานที่ผิด สมมติฐานเหล่านี้นำไปสู่วงจรอุบาทว์ดังนี้ –
ความจริงก็คือ Unit Testing ช่วยเพิ่มความเร็วในการพัฒนา
โปรแกรมเมอร์คิดว่า Integration Testing จะตรวจจับข้อผิดพลาดทั้งหมดและไม่ได้ดำเนินการทดสอบหน่วย เมื่อรวมหน่วยต่างๆ แล้ว ข้อผิดพลาดง่ายๆ ซึ่งสามารถพบและแก้ไขได้ง่ายมากในหน่วยที่ทดสอบจะใช้เวลานานมากในการติดตามและแก้ไข
ข้อได้เปรียบในการทดสอบหน่วย
- นักพัฒนาที่ต้องการเรียนรู้ว่าหน่วยมีฟังก์ชันอะไรบ้างและวิธีการใช้งานสามารถดูการทดสอบหน่วยเพื่อทำความเข้าใจพื้นฐานของ Unit API ได้
- การทดสอบยูนิตช่วยให้โปรแกรมเมอร์สามารถรีแฟกเตอร์โค้ดในภายหลัง และตรวจให้แน่ใจว่าโมดูลยังคงทำงานได้อย่างถูกต้อง (เช่น การทดสอบการถดถอย- ขั้นตอนคือการเขียนกรณีทดสอบสำหรับฟังก์ชันและวิธีการทั้งหมด เพื่อให้เมื่อใดก็ตามที่การเปลี่ยนแปลงทำให้เกิดข้อผิดพลาด จะสามารถระบุและแก้ไขได้อย่างรวดเร็ว
- เนื่องจากลักษณะโมดูลาร์ของการทดสอบหน่วย เราจึงสามารถทดสอบส่วนต่างๆ ของโครงการได้โดยไม่ต้องรอให้ส่วนอื่นๆ เสร็จสิ้น
ข้อเสียการทดสอบหน่วย
- การทดสอบหน่วยไม่สามารถคาดหวังที่จะตรวจจับทุกข้อผิดพลาดในโปรแกรม ไม่สามารถประเมินเส้นทางการดำเนินการทั้งหมดได้แม้จะอยู่ในโปรแกรมที่ไม่สำคัญที่สุดก็ตาม
- การทดสอบหน่วยโดยธรรมชาติแล้วมุ่งเน้นไปที่หน่วยของโค้ด ดังนั้นจึงไม่สามารถตรวจจับข้อผิดพลาดในการรวมระบบหรือข้อผิดพลาดระดับระบบในวงกว้างได้
แนะนำให้ใช้การทดสอบหน่วยร่วมกับกิจกรรมการทดสอบอื่นๆ
แนวทางปฏิบัติที่ดีที่สุดในการทดสอบหน่วย
- กรณีทดสอบหน่วยควรเป็นอิสระ ในกรณีที่มีการปรับปรุงหรือเปลี่ยนแปลงข้อกำหนด กรณีทดสอบหน่วยไม่ควรได้รับผลกระทบ
- ทดสอบเพียงรหัสเดียวในแต่ละครั้ง
- ปฏิบัติตามรูปแบบการตั้งชื่อที่ชัดเจนและสม่ำเสมอสำหรับการทดสอบหน่วยของคุณ
- ในกรณีที่มีการเปลี่ยนแปลงรหัสในโมดูลใดๆ ตรวจสอบให้แน่ใจว่ามีหน่วยที่เกี่ยวข้อง กรณีทดสอบ สำหรับโมดูลและโมดูลผ่านการทดสอบก่อนที่จะเปลี่ยนการใช้งาน
- ข้อบกพร่องที่ระบุระหว่างการทดสอบหน่วยต้องได้รับการแก้ไขก่อนที่จะดำเนินการขั้นต่อไปใน SDLC
- นำแนวทาง "ทดสอบเป็นโค้ดของคุณ" มาใช้ ยิ่งคุณเขียนโค้ดโดยไม่ทำการทดสอบมากเท่าไร คุณก็ยิ่งต้องตรวจสอบข้อผิดพลาดมากขึ้นเท่านั้น
สรุป
- การทดสอบหน่วยหมายถึงประเภทของการทดสอบซอฟต์แวร์ที่มีการทดสอบแต่ละหน่วยหรือส่วนประกอบของซอฟต์แวร์
- อย่างที่คุณเห็น การทดสอบยูนิตอาจเกี่ยวข้องกับหลายๆ อย่าง ซึ่งอาจซับซ้อนหรือค่อนข้างเรียบง่าย ขึ้นอยู่กับแอปพลิเคชันที่กำลังทดสอบและกลยุทธ์การทดสอบ เครื่องมือ และปรัชญาที่ใช้ การทดสอบยูนิตมีความจำเป็นอยู่เสมอในระดับหนึ่ง ซึ่งถือเป็นเรื่องแน่นอน