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

ความหมายของ 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
คำสั่งที่ทำเครื่องหมายสีเหลืองคือคำสั่งที่ถูกดำเนินการตามสถานการณ์ จำนวนคำสั่งที่ถูกดำเนินการ = 5 จำนวนคำสั่งทั้งหมด = 7 ดังนั้น อัตราการครอบคลุมคำสั่ง = 5/7 = 71%
สถานการณ์จำลอง 2: ถ้า A = -3, B = -9
คำสั่งที่ทำเครื่องหมายสีเหลืองคือคำสั่งที่ถูกดำเนินการตามสถานการณ์ จำนวนคำสั่งที่ถูกดำเนินการ = 6 จำนวนคำสั่งทั้งหมด = 7 ดังนั้น อัตราการครอบคลุมคำสั่ง = 6/7 = 85%
แต่โดยรวมแล้ว หากคุณสังเกต จะเห็นว่าข้อความทั้งหมดครอบคลุมอยู่ในทั้งสองสถานการณ์ ดังนั้นเราจึงสรุปได้ว่า การครอบคลุมข้อความโดยรวมนั้นอยู่ที่ 100%
คำชี้แจงความคุ้มครองครอบคลุมอะไรบ้าง?
- งบที่ไม่ได้ใช้
- ตาย Code
- สาขาที่ไม่ได้ใช้
- งบที่ขาดหายไป
การทดสอบความครอบคลุมการตัดสินใจ
ความคุ้มครองการตัดสินใจ การทดสอบความครอบคลุมการตัดสินใจ (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 ขอบเขตความคุ้มครองไม่ได้บอกว่าคุณได้ครอบคลุมตรรกะของคุณมากแค่ไหนและดีเพียงใด |






