Code เครื่องมือตรวจสอบความครอบคลุม: การทดสอบคำสั่ง การทดสอบสาขา และการทดสอบการตัดสินใจ

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

Code ความครอบคลุม (coverage) เป็นการวัดแบบไวท์บ็อกซ์ (white-box) ที่รายงานระดับที่ซอร์สโค้ดได้รับการทดสอบโดยชุดทดสอบping ทีมจะค้นหาคำสั่ง สาขา เงื่อนไข และเส้นทางที่ยังไม่ได้รับการทดสอบ ซึ่งอาจเป็นที่อยู่ของข้อบกพร่องที่ซ่อนอยู่

  • 🎯 ความหมาย: Code Coverage คือการวัดว่าการทดสอบของคุณดำเนินการกับซอร์สโค้ดไปมากน้อยแค่ไหน
  • 📊 วิธีการ: มีห้าวิธี ได้แก่ การครอบคลุมตามคำสั่ง การตัดสินใจ การแยกสาขา เงื่อนไข และเครื่องสถานะจำกัด
  • 🧩 คำสั่งเทียบกับสาขา: ความครอบคลุมของงบการเงินจะตรวจสอบบรรทัดต่างๆ ในขณะที่ความครอบคลุมของสาขาจะตรวจสอบผลลัพธ์ของการตัดสินใจทุกอย่าง
  • 🇧🇷 Code เทียบกับฟังก์ชันการใช้งาน: Code มาตรการความคุ้มครองใช้รหัสที่ใช้บังคับ มาตรการความคุ้มครองเชิงฟังก์ชันครอบคลุมข้อกำหนด
  • 🛠️ เครื่องมือ: Cobertura, OpenCloverEMMA และ Sonar เป็นระบบอัตโนมัติในการวัดความครอบคลุม
  • 🤖 ความช่วยเหลือจาก AI: เครื่องมือ AI สร้างชุดทดสอบและค้นหาช่องว่างความคุ้มครองที่มีความเสี่ยงสูงและยังไม่ได้รับการทดสอบโดยอัตโนมัติ

Code บทช่วยสอนเรื่องความคุ้มครอง

ความหมายของ Code ความคุ้มครอง?

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

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

ทำไมต้องใช้ Code การทดสอบความครอบคลุม?

ต่อไปนี้เป็นเหตุผลสำคัญบางประการในการใช้การครอบคลุมโค้ด:

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

Code วิธีการครอบคลุม

วิธีการหลักในการวัดความครอบคลุมของโค้ดมีดังต่อไปนี้:

  • ความคุ้มครองคำชี้แจง
  • ความคุ้มครองการตัดสินใจ
  • ความคุ้มครองสาขา
  • Togglอีความคุ้มครอง
  • ความคุ้มครอง FSM

ความคุ้มครองคำชี้แจง

ความคุ้มครองคำชี้แจง การครอบคลุมคำสั่ง (Statement Coverage หรือ Statement Coverage) เป็นเทคนิคการทดสอบแบบกล่องขาว (White Box Testing) ที่คำสั่งที่สามารถทำงานได้ทั้งหมดในซอร์สโค้ดจะถูกเรียกใช้งานอย่างน้อยหนึ่งครั้ง ใช้ในการคำนวณจำนวนคำสั่งในซอร์สโค้ดที่ถูกเรียกใช้งาน จุดประสงค์หลักของการครอบคลุมคำสั่งคือการครอบคลุมเส้นทาง บรรทัด และคำสั่งที่เป็นไปได้ทั้งหมดในซอร์สโค้ด

การวิเคราะห์ความครอบคลุมของคำสั่ง (Statement coverage) ใช้เพื่อสร้างสถานการณ์จำลองโดยพิจารณาจากโครงสร้างของโค้ดที่กำลังทดสอบ

ความคุ้มครองคำชี้แจง

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

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

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

แหล่ง Code:

Prints (int a, int b) {                       ------------  Printsum is a function
    int result = a + b;
    If (result > 0)
        Print ("Positive", result)
    Else
        Print ("Negative", result)
    }                                        -----------   End of the source code

สถานการณ์จำลอง 1: ถ้า A = 3, B = 9

สถานการณ์ความคุ้มครองตามคำแถลง 1

คำสั่งที่ทำเครื่องหมายสีเหลืองคือคำสั่งที่ถูกดำเนินการตามสถานการณ์ จำนวนคำสั่งที่ถูกดำเนินการ = 5 จำนวนคำสั่งทั้งหมด = 7 ดังนั้น อัตราการครอบคลุมคำสั่ง = 5/7 = 71%

สถานการณ์จำลอง 2: ถ้า A = -3, B = -9

สถานการณ์ความคุ้มครองตามคำแถลง 2

คำสั่งที่ทำเครื่องหมายสีเหลืองคือคำสั่งที่ถูกดำเนินการตามสถานการณ์ จำนวนคำสั่งที่ถูกดำเนินการ = 6 จำนวนคำสั่งทั้งหมด = 7 ดังนั้น อัตราการครอบคลุมคำสั่ง = 6/7 = 85%

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

คำชี้แจงความคุ้มครองครอบคลุมอะไรบ้าง?

  1. งบที่ไม่ได้ใช้
  2. ตาย Code
  3. สาขาที่ไม่ได้ใช้
  4. งบที่ขาดหายไป

การทดสอบความครอบคลุมการตัดสินใจ

ความคุ้มครองการตัดสินใจ การทดสอบความครอบคลุมการตัดสินใจ (Decision Coverage Testing หรือ DEC) เป็นเทคนิคการทดสอบแบบกล่องขาว (White Box Testing) ซึ่งรายงานผลลัพธ์ที่เป็นจริงหรือเท็จของแต่ละนิพจน์บูลีนในโค้ดต้นฉบับ เป้าหมายของการทดสอบความครอบคลุมการตัดสินใจคือการครอบคลุมและตรวจสอบความถูกต้องของโค้ดต้นฉบับทั้งหมดที่สามารถเข้าถึงได้ โดยการตรวจสอบและรับรองว่าแต่ละสาขาของจุดตัดสินใจที่เป็นไปได้ทุกจุดนั้นถูกดำเนินการอย่างน้อยหนึ่งครั้ง

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

การทดสอบความครอบคลุมการตัดสินใจ

ตัวอย่างการครอบคลุมการตัดสินใจ

พิจารณารหัสต่อไปนี้:

Demo(int a) {
    If (a > 5)
        a = a * 3
    Print (a)
    }

สถานการณ์จำลอง 1: ค่าของ a คือ 2 ผลลัพธ์ "ไม่" ของการตัดสินใจ หาก (a>5) ถูกเลือก ดังนั้น ความครอบคลุมของการตัดสินใจ = 50%

สถานการณ์จำลอง 2: ค่าของ a คือ 6 ผลลัพธ์ "ใช่" ของการตัดสินใจ ถ้า (a>5) ถูกเลือก ดังนั้น ความครอบคลุมของการตัดสินใจ = 50%

กรณีทดสอบ มูลค่าของ A เอาท์พุต ความคุ้มครองการตัดสินใจ
1 2 2 50%
2 6 18 50%

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

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

ตัวอย่างเช่น หากผลลัพธ์เป็นแบบไบนารี คุณต้องทดสอบผลลัพธ์ทั้งจริงและเท็จ

สูตรคำนวณความครอบคลุมสาขา:

สูตรการครอบคลุมสาขา

ตัวอย่างความคุ้มครองสาขา

เพื่อเรียนรู้เรื่อง Branch Coverage ให้พิจารณาตัวอย่างเดียวกันกับที่ใช้ไปก่อนหน้านี้ Branch Coverage จะพิจารณาเงื่อนไขของ Branch ด้วยเช่นกัน

กรณีทดสอบ มูลค่าของ A เอาท์พุต ความคุ้มครองการตัดสินใจ ความคุ้มครองสาขา
1 2 2 50% 33%
2 6 18 50% 67%

ข้อดีของการครอบคลุมสาขา:

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

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

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

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

สูตรคำนวณความครอบคลุมของเงื่อนไข:

สูตรการคำนวณความคุ้มครองเงื่อนไข

สำหรับนิพจน์ที่มีตัวถูกดำเนินการสองตัว จะมีชุดค่าผสมที่เป็นไปได้สี่แบบ ได้แก่ TT, FF, TF และ FT พิจารณาอินพุต X=3, Y=4 (x b) เท็จ ซึ่งจะทำให้ความคุ้มครองตามเงื่อนไขเท่ากับ 1/4 = 25%

ความครอบคลุมของเครื่องจักรที่มีสถานะจำกัด

การวัดความครอบคลุมของโค้ดโดยใช้เครื่องสถานะจำกัด (Finite State Machine) นั้นซับซ้อนที่สุดวิธีหนึ่ง เนื่องจากเป็นการวิเคราะห์พฤติกรรมของตัวออกแบบ ในวิธีการนี้ คุณต้องตรวจสอบว่าสถานะเฉพาะนั้นถูกเข้าถึงหรือเปลี่ยนผ่านกี่ครั้ง และยังตรวจสอบจำนวนลำดับ (sequence) ที่รวมอยู่ในเครื่องสถานะจำกัดด้วย

ประเภทของ Code ความคุ้มครองให้เลือกสรร

นี่เป็นคำตอบที่ยากที่สุดอย่างแน่นอน ในการเลือกวิธีการทดสอบความครอบคลุม ผู้ทดสอบจำเป็นต้องตรวจสอบว่า:

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

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

Code ความคุ้มครองเทียบกับความคุ้มครองตามหน้าที่

Code คุ้มครอง ครอบคลุมการทำงาน
บอกคุณว่าโค้ดต้นฉบับได้รับการทดสอบโดยชุดทดสอบของคุณได้ดีแค่ไหน วัดว่าชุดทดสอบของคุณครอบคลุมการทำงานของดีไซน์ได้ดีเพียงใด
ไม่เคยใช้ข้อกำหนดด้านการออกแบบเลย ใช้ข้อกำหนดการออกแบบ
ดำเนินการโดยนักพัฒนา ดำเนินการโดยผู้ทดสอบ

Code เครื่องมือการครอบคลุม

ต่อไปนี้คือรายชื่อเครื่องมือสำคัญสำหรับการวัดความครอบคลุมของโค้ด:

ชื่อเครื่องมือ Descriptไอออน
Cobertura เครื่องมือโอเพนซอร์สสำหรับวัดความครอบคลุมของโค้ด โดยจะวัดความครอบคลุมของการทดสอบด้วยการติดตั้งเครื่องมือลงในฐานโค้ด และวิเคราะห์ว่าบรรทัดโค้ดใดบ้างที่ถูกเรียกใช้งาน และบรรทัดใดบ้างที่ไม่ถูกเรียกใช้งาน เมื่อชุดทดสอบทำงาน
ไม้จำพวกถั่ว โคลเวอร์ (OpenCloverนอกจากนี้ยังช่วยลดเวลาในการทดสอบด้วยการเรียกใช้การทดสอบเฉพาะส่วนที่ครอบคลุมโค้ดแอปพลิเคชันที่ได้รับการแก้ไขนับตั้งแต่เวอร์ชันก่อนหน้าเท่านั้น
DevPartner DevPartner ช่วยให้นักพัฒนาวิเคราะห์ได้ Java โค้ดสำหรับคุณภาพและความซับซ้อนของโค้ด
Emma EMMA รองรับการครอบคลุมข้อมูลระดับคลาส เมธอด บรรทัด และบล็อกพื้นฐาน โดยรวบรวมข้อมูลที่ระดับไฟล์ต้นฉบับ คลาส และเมธอด
คาลิสติก Kalistick เป็นแอปพลิเคชันจากบริษัทภายนอกที่วิเคราะห์โค้ดจากมุมมองต่างๆ
CoView และ CoAnt เครื่องมือวัดความครอบคลุมของโค้ด สำหรับการวัดเมตริก การสร้างอ็อบเจ็กต์จำลอง ความสามารถในการทดสอบโค้ด ความครอบคลุมของเส้นทางและสาขา และอื่นๆ อีกมากมาย
เป้าสำหรับ C++ BullseyeCoverage เป็นเครื่องมือตรวจสอบความครอบคลุมของโค้ดสำหรับ C++ และซี
Sonar Sonar เป็นเครื่องมือโอเพนซอร์สสำหรับวัดความครอบคลุมของโค้ด ซึ่งช่วยให้คุณจัดการคุณภาพของโค้ดได้

ข้อดีและข้อเสียของการใช้ Code คุ้มครอง

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

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

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

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

Code ความครอบคลุม (coverage) คือการวัดว่าโค้ดต้นฉบับส่วนใดถูกเรียกใช้งานระหว่างการทดสอบ ความครอบคลุมของการทดสอบนั้นกว้างกว่า tracประเมินว่าการทดสอบตอบสนองความต้องการ คุณสมบัติ และความเสี่ยงได้ดีเพียงใด Code ความครอบคลุมเป็นปัจจัยหนึ่งในการพิจารณาความครอบคลุมของการทดสอบโดยรวม

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

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

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

OpenClover เครื่องมือนี้ใช้วัดความครอบคลุมของคำสั่ง สาขา และเมธอด และรวบรวมตัวชี้วัดมากกว่า 20 รายการ Coberturaเอ็มม่า และ JaCoCo มีตัวเลือกฟรีอื่นๆ ที่ใช้กันอย่างแพร่หลายอีกหรือไม่ Java โครงการ

การครอบคลุมเงื่อนไข/การตัดสินใจแบบปรับปรุง (Modified Condition/Decision Coverage) กำหนดให้แต่ละเงื่อนไขในการตัดสินใจต้องส่งผลต่อผลลัพธ์โดยอิสระ ซึ่งเข้มงวดกว่าการครอบคลุมแบบแยกสาขา (Branch Coverage) และเป็นข้อบังคับสำหรับซอฟต์แวร์ที่สำคัญต่อความปลอดภัย เช่น ระบบอิเล็กทรอนิกส์การบิน ภายใต้มาตรฐาน DO-178C

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