ความครอบคลุมของการทดสอบในการทดสอบซอฟต์แวร์: วิธีการวัดความครอบคลุม

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

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

  • 🎯 ความหมาย: รายงานความครอบคลุมของการทดสอบ ระบุว่าข้อกำหนด คุณสมบัติ และเส้นทางการทำงานของโค้ดใดบ้างที่การทดสอบที่มีอยู่ได้ดำเนินการไปแล้ว
  • 🧭 ประเภท: คำแถลง สาขา เงื่อนไข เส้นทาง ข้อกำหนด และความคุ้มครองความเสี่ยง แต่ละอย่างให้คำตอบที่แตกต่างกันในคำถามต่างๆ
  • 🇧🇷 Code เทียบกับการทดสอบ: Code วัดความครอบคลุมของการทดสอบโดยพิจารณาจากบรรทัดโค้ดที่ดำเนินการ ในขณะที่วัดความครอบคลุมของการทดสอบโดยพิจารณาจากแผนการทดสอบโดยรวม
  • 🧮 สูตร: นำจำนวนบรรทัดที่ดำเนินการแล้วหารด้วยจำนวนบรรทัดทั้งหมด จากนั้นคูณด้วย 100 เพื่อคำนวณเป็นเปอร์เซ็นต์
  • 🛠️ เทคนิค: การวิเคราะห์ค่าขอบเขต ตารางการตัดสินใจ และการทดสอบการเปลี่ยนสถานะ ช่วยขยายขอบเขตการครอบคลุมโดยไม่ทำให้ชุดเครื่องมือมีขนาดใหญ่ขึ้น
  • 📈 การเพิ่มประสิทธิภาพ: จัดลำดับโมดูลตามความเสี่ยง สร้างชุดการทดสอบการถดถอยแบบอัตโนมัติ และตรวจสอบแนวโน้มความครอบคลุมในทุกสปรินต์
  • 🤖 ความช่วยเหลือจาก AI: เครื่องมือ AI จะสร้างการทดสอบหน่วยที่ขาดหายไปและจัดอันดับเส้นทางที่ยังไม่ได้ทดสอบตามความเสี่ยงในการใช้งานจริง

ความครอบคลุมการทดสอบคืออะไร?

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

พูดง่ายๆ ก็คือเทคนิคเพื่อให้แน่ใจว่าการทดสอบของคุณกำลังทดสอบโค้ดของคุณ หรือคุณใช้โค้ดจำนวนเท่าใดจากการรันการทดสอบ

การครอบคลุมการทดสอบมีประโยชน์อย่างไร?

ในการใช้งานจริงของโครงการ การครอบคลุมการทดสอบช่วยสนับสนุนกิจกรรมเชิงปฏิบัติสี่ประการดังนี้:

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

ประโยชน์ของความครอบคลุมการทดสอบในวิศวกรรมซอฟต์แวร์

กิจกรรมเหล่านั้นก่อให้เกิดประโยชน์ทางวิศวกรรมที่เป็นรูปธรรม

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

ประเภทของความครอบคลุมการทดสอบ

การครอบคลุมพื้นที่ไม่ใช่แค่ตัวเลขเดียวเสมอไป ทีมต่างๆ tracคุณอาจพบคำถามหลายประเภทพร้อมกัน เนื่องจากแต่ละประเภทตอบคำถามที่แตกต่างกันเกี่ยวกับชุดคำถามเดียวกัน ตารางด้านล่างจัดกลุ่มประเภทที่คุณพบบ่อยที่สุด

ประเภทความคุ้มครอง สิ่งที่วัดได้ ใช้ดีที่สุดสำหรับ
ความคุ้มครอง (บรรทัด) ของคำแถลง บรรทัดคำสั่งที่เรียกใช้งานได้จะทำงานอย่างน้อยหนึ่งครั้ง การทดสอบหน่วยและการตรวจสอบโค้ดเก่า
ขอบเขตสาขาหรือการตัดสินใจ ผลลัพธ์ที่ถูกต้องและไม่ถูกต้องของทุกการตัดสินใจ ตรรกะแบบมีเงื่อนไขและการตรวจสอบความถูกต้อง
ความคุ้มครองตามเงื่อนไข แต่ละนิพจน์ย่อยแบบบูลีนเป็นค่าจริงและค่าเท็จ นิพจน์ AND หรือ OR แบบผสม
การครอบคลุมเส้นทาง เส้นทางเฉพาะที่ใช้ผ่านโมดูล กระแสเงินและธุรกรรมที่สำคัญต่อความปลอดภัย
การครอบคลุมฟังก์ชัน ฟังก์ชันหรือเมธอดที่ถูกเรียกใช้โดยการทดสอบ เลเยอร์ API และบริการ
ความต้องการความคุ้มครอง ข้อกำหนดที่เชื่อมโยงกับการทดสอบอย่างน้อยหนึ่งรายการ การยอมรับและข้อตกลงtracการลงนามอนุมัติ
ความคุ้มครองความเสี่ยง พื้นที่ที่มีความเสี่ยงสูงที่ระบุไว้ได้รับการตรวจสอบแล้ว รอบการปลดปล่อยสั้น

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

อะไรคือความแตกต่างหลักระหว่าง Code ความครอบคลุมและความครอบคลุมของการทดสอบ?

Code ความคุ้มครอง และความครอบคลุมของการทดสอบเป็นเทคนิคการวัดที่ช่วยให้คุณสามารถประเมินคุณภาพของโค้ดแอปพลิเคชันของคุณได้

ต่อไปนี้เป็นข้อแตกต่างที่สำคัญบางประการระหว่างบูธของวิธีการครอบคลุมเหล่านี้:

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

สูตรความครอบคลุมการทดสอบ

หากต้องการคำนวณความครอบคลุมของการทดสอบ คุณต้องทำตามขั้นตอนด้านล่าง:

ขั้นตอน 1) นับ Yจำนวนบรรทัดโค้ดทั้งหมดในซอฟต์แวร์ที่คุณกำลังพัฒนา การทดสอบ

ขั้นตอน 2) นับ Xจำนวนบรรทัดโค้ดที่เคสทดสอบทั้งหมดดำเนินการในปัจจุบัน

ตอนนี้ คุณต้องหา (X หารด้วย Y) คูณด้วย 100 ผลลัพธ์ของการคำนวณนี้คือ % ความครอบคลุมของการทดสอบของคุณ

ตัวอย่างเช่น:

หากจำนวนบรรทัดโค้ดในส่วนประกอบของระบบมี 500 บรรทัด และจำนวนบรรทัดที่ถูกเรียกใช้งานในกรณีทดสอบทั้งหมดที่มีอยู่คือ 50 บรรทัด แสดงว่าความครอบคลุมของการทดสอบของคุณคือ:

(50 / 500) * 100 = 10%   // executed lines divided by total lines

ตัวอย่างความครอบคลุมการทดสอบ

เปอร์เซ็นต์เพียงอย่างเดียวไม่ใช่ข้อมูลทั้งหมดเสมอไป ดังตัวอย่างด้านล่างจะแสดงให้เห็น

1 ตัวอย่าง:

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

2 ตัวอย่าง:

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

เทคนิคการครอบคลุมการทดสอบ

ตัวอย่างทั้งสองชี้ให้เห็นข้อสรุปเดียวกัน: การบรรลุเป้าหมายด้านความครอบคลุมนั้นขึ้นอยู่กับการเลือกเทคนิคการออกแบบการทดสอบที่เหมาะสมมากกว่าการเขียนการทดสอบเพิ่มเติม เทคนิคด้านล่างนี้ช่วยขยายความครอบคลุมในขณะที่ยังคงรักษา...ping ห้องสวีทมีขนาดเล็ก

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

จะทำการทดสอบให้ครอบคลุมได้อย่างไร?

เมื่อเลือกเทคนิคแล้ว เส้นทางหลักสี่เส้นทางที่กำหนดไว้จะให้บริการครอบคลุมพื้นที่

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

วิธีปรับปรุงความครอบคลุมของการทดสอบ

การสร้างความครอบคลุมเป็นจุดเริ่มต้น การเพิ่มความครอบคลุมเป็นขั้นตอนที่ทำซ้ำได้ ดำเนินการตามลำดับนี้ในตอนเริ่มต้นของรอบการปล่อยเวอร์ชันทุกครั้ง

  1. กำหนดตัวเลขปัจจุบันเป็นค่าพื้นฐาน เรียกใช้รายงานความครอบคลุมและบันทึกความครอบคลุมของคำสั่ง สาขา และข้อกำหนดแยกกัน เพื่อให้เห็นช่องว่างในแต่ละโมดูลได้อย่างชัดเจน แทนที่จะซ่อนอยู่ภายในค่าเฉลี่ยโดยรวมของโครงการ
  2. จัดทำแผนที่การทดสอบให้สอดคล้องกับข้อกำหนด สร้างไฟล์ tracตารางความน่าจะเป็นที่เชื่อมโยงข้อกำหนดทุกข้อเข้ากับกรณีทดสอบอย่างน้อยหนึ่งกรณี แถวว่างใดๆ หมายถึงช่องโหว่ที่ได้รับการยืนยันแล้ว ไม่ใช่ข้อสงสัย
  3. จัดลำดับโมดูลตามระดับความเสี่ยง ตรรกะเกี่ยวกับการชำระเงิน การตรวจสอบสิทธิ์ และการย้ายข้อมูล สมควรได้รับการอธิบายอย่างละเอียดมากกว่าแค่หน้าจอช่วยเหลือแบบคงที่ ดังนั้นควรทุ่มงบประมาณในส่วนที่หากเกิดข้อผิดพลาดจะส่งผลกระทบมากที่สุด
  4. เพิ่มกรณีเชิงลบและกรณีพิเศษเข้าไปด้วย ข้อมูลป้อนเข้าที่ว่างเปล่า ค่าที่มีขนาดใหญ่เกินไป การหมดเวลาของเครือข่าย และข้อผิดพลาดด้านสิทธิ์ จะส่งผลกระทบต่อส่วนต่างๆ ที่การทดสอบแบบปกติไม่เคยพบเห็น
  5. เพิ่มระดับการทดสอบทีละชั้น รวมกัน การทดสอบหน่วย, การทดสอบการรวมและมีการตรวจสอบแบบครบวงจร เนื่องจากแต่ละระดับจะครอบคลุมสิ่งที่ระดับอื่นไม่สามารถทำได้ในเชิงโครงสร้าง
  6. ทำการทดสอบการถดถอยแบบอัตโนมัติ Promoกรณีที่เสถียรเข้าสู่ การทดสอบอัตโนมัติ และดำเนินการภายในนั้น ไปป์ไลน์ CI/CD หลังจากทำการคอมมิตทุกครั้ง
  7. ยกเลิกคดีที่ซ้ำซ้อน ลบการทดสอบที่ซ้ำซ้อนซึ่งเพิ่มเวลาในการประมวลผลโดยไม่เพิ่มบรรทัดที่ไม่ครอบคลุมแม้แต่บรรทัดเดียว
  8. Revสังเกตแนวโน้มในทุกรอบการวิ่ง Tracความครอบคลุม k ถัดจาก ความหนาแน่นของข้อบกพร่องการรั่วซึมที่เพิ่มขึ้นเมื่อเทียบกับพื้นที่ราบเรียบ เป็นสัญญาณเตือนล่วงหน้าของจุดบอด

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

ข้อเสียของการครอบคลุมการทดสอบ

ความคุ้มครองยังคงมีคุณค่า แต่ก็มีข้อจำกัดที่ควรระบุไว้ก่อนที่จะรายงานเป็นเปอร์เซ็นต์ใดๆ

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

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

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

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

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

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

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

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