บทช่วยสอนการครอบคลุมโค้ด: สาขา คำชี้แจง และการทดสอบการตัดสินใจ
ความคุ้มครองรหัสคืออะไร?
การครอบคลุมโค้ดคือการวัดที่อธิบายถึงระดับการทดสอบโค้ดต้นฉบับของโปรแกรม เป็นรูปแบบหนึ่งของการทดสอบแบบกล่องสีขาวซึ่งจะค้นหาพื้นที่ของโปรแกรมที่ไม่ได้ใช้งานโดยชุดกรณีทดสอบ นอกจากนี้ยังสร้างกรณีทดสอบบางกรณีขึ้นเพื่อเพิ่มการครอบคลุมและกำหนดการวัดเชิงปริมาณของการครอบคลุมโค้ด
ในกรณีส่วนใหญ่ ระบบครอบคลุมโค้ดจะรวบรวมข้อมูลเกี่ยวกับโปรแกรมที่กำลังทำงานอยู่ นอกจากนี้ยังรวมข้อมูลดังกล่าวเข้ากับข้อมูลซอร์สโค้ดเพื่อสร้างรายงานเกี่ยวกับการครอบคลุมโค้ดของชุดทดสอบ
เหตุใดจึงต้องใช้การทดสอบการครอบคลุมโค้ด
ต่อไปนี้เป็นเหตุผลสำคัญบางประการในการใช้การครอบคลุมโค้ด:
- ช่วยให้คุณวัดประสิทธิภาพของการดำเนินการทดสอบ
- มันมีการวัดเชิงปริมาณ
- มันกำหนดระดับที่ซอร์สโค้ดได้รับการทดสอบ
วิธีการครอบคลุมโค้ด
ต่อไปนี้เป็นวิธีการครอบคลุมรหัสหลัก
- ความคุ้มครองคำชี้แจง
- ความคุ้มครองการตัดสินใจ
- ความคุ้มครองสาขา
- Togglอีความคุ้มครอง
- ความคุ้มครอง FSM
ความคุ้มครองคำชี้แจง
ความคุ้มครองคำชี้แจง เป็นเทคนิคการทดสอบแบบกล่องสีขาวซึ่งคำสั่งที่สามารถทำงานได้ทั้งหมดในโค้ดต้นฉบับจะถูกดำเนินการอย่างน้อยหนึ่งครั้ง ใช้เพื่อคำนวณจำนวนคำสั่งในโค้ดต้นฉบับที่ถูกดำเนินการ วัตถุประสงค์หลักของ Statement Coverage คือการครอบคลุมเส้นทาง บรรทัด และคำสั่งที่เป็นไปได้ทั้งหมดในโค้ดต้นฉบับ
ความครอบคลุมของคำชี้แจงจะใช้เพื่อให้ได้มาซึ่งสถานการณ์ตามโครงสร้างของรหัสที่อยู่ระหว่างการทดสอบ
In สีขาว Box การทดสอบผู้ทดสอบกำลังมุ่งเน้นไปที่วิธีการทำงานของซอฟต์แวร์ กล่าวอีกนัยหนึ่ง ผู้ทดสอบจะมุ่งเน้นไปที่การทำงานภายในของซอร์สโค้ดที่เกี่ยวข้องกับกราฟโฟลว์ควบคุมหรือโฟลว์ชาร์ต
โดยทั่วไปแล้ว หากเราพิจารณาจากโค้ดต้นฉบับในซอฟต์แวร์ใดๆ ก็จะพบว่ามีองค์ประกอบต่างๆ มากมาย เช่น ตัวดำเนินการ ฟังก์ชัน การวนซ้ำ ตัวจัดการพิเศษ เป็นต้น โดยขึ้นอยู่กับอินพุตของโปรแกรม คำสั่งโค้ดบางคำสั่งอาจไม่ได้ดำเนินการ เป้าหมายของการครอบคลุมคำสั่งคือเพื่อครอบคลุมเส้นทาง บรรทัด และคำสั่งที่เป็นไปได้ทั้งหมดในโค้ด
มาทำความเข้าใจกับตัวอย่างวิธีคำนวณความครอบคลุมของใบแจ้งยอด
สถานการณ์จำลองในการคำนวณความครอบคลุมของคำชี้แจงสำหรับซอร์สโค้ดที่กำหนด ที่นี่เราใช้สถานการณ์ที่แตกต่างกันสองสถานการณ์เพื่อตรวจสอบเปอร์เซ็นต์ความครอบคลุมของใบแจ้งยอดสำหรับแต่ละสถานการณ์
รหัสแหล่งที่มา:
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
สถานการณ์จำลอง 2:
ถ้า A = -3, B = -9
ข้อความที่ทำเครื่องหมายด้วยสีเหลืองคือข้อความที่ดำเนินการตามสถานการณ์
จำนวนคำสั่งที่ดำเนินการ = 6
จำนวนใบแจ้งยอดทั้งหมด = 7
ความครอบคลุมของคำชี้แจง: 6/7 = 85%
แต่โดยรวมแล้วหากคุณเห็น ข้อความทั้งหมดก็ครอบคลุมอยู่ในทั้งสองสถานการณ์ ดังนั้นเราจึงสามารถสรุปได้ว่าความครอบคลุมของใบแจ้งยอดโดยรวมคือ 100%
คำชี้แจงความคุ้มครองครอบคลุมอะไรบ้าง?
- งบที่ไม่ได้ใช้
- รหัสตาย
- สาขาที่ไม่ได้ใช้
- งบที่ขาดหายไป
การทดสอบความครอบคลุมการตัดสินใจ
ความคุ้มครองการตัดสินใจ เป็นเทคนิคการทดสอบกล่องสีขาวซึ่งรายงานผลลัพธ์ที่เป็นจริงหรือเท็จของนิพจน์บูลีนแต่ละรายการของโค้ดต้นฉบับ เป้าหมายของการทดสอบการครอบคลุมการตัดสินใจคือการครอบคลุมและตรวจสอบโค้ดต้นฉบับที่สามารถเข้าถึงได้ทั้งหมดโดยการตรวจสอบและให้แน่ใจว่ามีการดำเนินการทุกสาขาของจุดตัดสินใจที่เป็นไปได้อย่างน้อยหนึ่งครั้ง
ในประเภทการครอบคลุมนี้ นิพจน์อาจมีความซับซ้อน ทำให้การครอบคลุมถึง 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% |
การทดสอบความครอบคลุมสาขา
ความคุ้มครองสาขา เป็นวิธีการทดสอบกล่องสีขาวซึ่งผลลัพธ์ทั้งหมดจากโมดูลโค้ด (คำสั่งหรือลูป) จะถูกทดสอบ วัตถุประสงค์ของการครอบคลุมสาขาคือเพื่อให้แน่ใจว่าเงื่อนไขการตัดสินใจแต่ละเงื่อนไขจากทุกสาขาจะถูกดำเนินการอย่างน้อยหนึ่งครั้ง วิธีนี้ช่วยในการวัดเศษส่วนของเซกเมนต์โค้ดอิสระและค้นหาส่วนต่างๆ ที่ไม่มีสาขา
ตัวอย่างเช่น หากผลลัพธ์เป็นแบบไบนารี คุณต้องทดสอบผลลัพธ์ทั้งจริงและเท็จ
สูตรคำนวณความครอบคลุมสาขา:
ตัวอย่างความคุ้มครองสาขา
หากต้องการเรียนรู้ความครอบคลุมของสาขา ลองพิจารณาตัวอย่างเดียวกันกับที่ใช้ก่อนหน้านี้
ลองพิจารณาโค้ดต่อไปนี้
Demo(int a) {
If (a> 5)
a=a*3
Print (a)
}
ความครอบคลุมของสาขาจะพิจารณาสาขาที่ไม่มีเงื่อนไขเช่นกัน
| กรณีทดสอบ | มูลค่าของ A | เอาท์พุต | ความคุ้มครองการตัดสินใจ | ความคุ้มครองสาขา |
|---|---|---|---|---|
| 1 | 2 | 2 | 50% | 33% |
| 2 | 6 | 18 | 50% | 67% |
ข้อดีของการครอบคลุมสาขา:
การทดสอบการครอบคลุมสาขาให้ข้อดีดังต่อไปนี้:
- ช่วยให้คุณสามารถตรวจสอบสาขาทั้งหมดในโค้ดได้
- ช่วยให้คุณมั่นใจได้ว่าไม่มีการแยกสาขาที่นำไปสู่ความผิดปกติของการทำงานของโปรแกรม
- วิธีการครอบคลุมสาขาจะช่วยขจัดปัญหาที่เกิดขึ้นเนื่องจากการทดสอบความครอบคลุมของใบแจ้งยอด
- ช่วยให้คุณค้นหาพื้นที่เหล่านั้นที่ไม่ได้รับการทดสอบโดยวิธีการทดสอบอื่นๆ
- ช่วยให้คุณค้นหาการวัดเชิงปริมาณของการครอบคลุมโค้ด
- ความครอบคลุมสาขาจะละเว้นสาขาภายในนิพจน์บูลีน
การทดสอบความครอบคลุมของสภาพ
ความคุ้มครองสภาพ หรือการครอบคลุมการแสดงออกเป็นวิธีการทดสอบที่ใช้เพื่อทดสอบและประเมินตัวแปรหรือนิพจน์ย่อยในคำสั่งเงื่อนไข เป้าหมายของการครอบคลุมเงื่อนไขคือการตรวจสอบผลลัพธ์แต่ละรายการสำหรับเงื่อนไขเชิงตรรกะแต่ละเงื่อนไข การครอบคลุมเงื่อนไขให้ความไวต่อกระแสควบคุมที่ดีกว่าการครอบคลุมการตัดสินใจ ในการครอบคลุมนี้ จะพิจารณาเฉพาะนิพจน์ที่มีตัวดำเนินการเชิงตรรกะเท่านั้น
ตัวอย่างเช่น หากนิพจน์มีการดำเนินการบูลีน เช่น AND, OR, XOR ซึ่งระบุถึงความเป็นไปได้ทั้งหมด
ความคุ้มครองตามเงื่อนไขไม่ได้ให้การรับประกันเกี่ยวกับความคุ้มครองการตัดสินใจทั้งหมด
สูตรคำนวณความครอบคลุมของเงื่อนไข:
ตัวอย่าง:
สำหรับนิพจน์ข้างต้น เรามีชุดค่าผสมที่เป็นไปได้ 4 ชุด
- TT
- FF
- TF
- FT
พิจารณาอินพุตต่อไปนี้
| X = 3
ป=4 |
(x | TRUE | ความครอบคลุมของสภาพคือ ¼ = 25% |
| A = 3
B = 4 |
(ก>ข) | FALSE |
ความครอบคลุมของเครื่องจักรที่มีสถานะจำกัด
การครอบคลุมของเครื่องจักรสถานะจำกัดเป็นวิธีการครอบคลุมโค้ดที่ซับซ้อนที่สุด เนื่องจากวิธีการนี้ทำงานตามพฤติกรรมของการออกแบบ ในวิธีการครอบคลุมนี้ คุณต้องค้นหาว่ามีสถานะเฉพาะเวลาจำนวนเท่าใดที่เยี่ยมชมและผ่านไปยังอีกจำนวนหนึ่ง นอกจากนี้ยังตรวจสอบจำนวนลำดับที่รวมอยู่ในเครื่องจักรสถานะจำกัดอีกด้วย
ประเภทของรหัสครอบคลุมให้เลือก
นี่เป็นคำตอบที่ตอบยากที่สุดอย่างแน่นอน ในการเลือกวิธีการครอบคลุม ผู้ทดสอบจำเป็นต้องตรวจสอบว่า
- รหัสที่อยู่ระหว่างการทดสอบมีข้อบกพร่องที่ยังไม่ถูกค้นพบจุดเดียวหรือหลายจุด
- ค่าปรับที่อาจเกิดขึ้น
- ต้นทุนชื่อเสียงที่เสียไป
- ต้นทุนการขายที่หายไป ฯลฯ
ยิ่งความน่าจะเป็นที่ข้อบกพร่องจะทำให้เกิดความล้มเหลวในการผลิตที่มีต้นทุนสูงขึ้นเท่าใด ระดับความครอบคลุมที่คุณต้องเลือกก็จะยิ่งรุนแรงมากขึ้นเท่านั้น
ความครอบคลุมของโค้ดเทียบกับความครอบคลุมด้านการใช้งาน
| รหัสครอบคลุม | ครอบคลุมการทำงาน |
|---|---|
| การครอบคลุมโค้ดจะบอกคุณว่าหน่วยงานทดสอบของคุณใช้ซอร์สโค้ดได้ดีเพียงใด | ความครอบคลุมด้านฟังก์ชันจะวัดว่าม้านั่งทดสอบของคุณครอบคลุมฟังก์ชันการทำงานของการออกแบบได้ดีเพียงใด |
| ห้ามใช้ข้อกำหนดการออกแบบ | ใช้ข้อกำหนดการออกแบบ |
| ทำโดยนักพัฒนา | ทำโดยผู้ทดสอบ |
เครื่องมือครอบคลุมโค้ด
นี่คือรายการเครื่องมือครอบคลุมโค้ดที่สำคัญ:
| ชื่อเครื่องมือ | Descriptไอออน |
|---|---|
| Cobertura | เป็นเครื่องมือครอบคลุมโค้ดโอเพ่นซอร์ส โดยจะวัดความครอบคลุมของการทดสอบโดยใช้เครื่องมือฐานโค้ดและวิเคราะห์บรรทัดของโค้ดที่กำลังดำเนินการและบรรทัดใดที่ไม่ถูกดำเนินการเมื่อชุดการทดสอบทำงาน |
| ไม้จำพวกถั่ว | Clover ยังช่วยลดเวลาการทดสอบด้วยการรันเฉพาะการทดสอบที่ครอบคลุมโค้ดแอปพลิเคชันที่ถูกปรับเปลี่ยนตั้งแต่รุ่นก่อน |
| DevPartner | DevPartner ช่วยให้นักพัฒนาวิเคราะห์ได้ Java โค้ดสำหรับคุณภาพและความซับซ้อนของโค้ด |
| Emma | EMMA รองรับคลาส วิธีการ บรรทัด และบล็อกฐาน ระดับไฟล์ต้นฉบับรวม คลาส และเมธอด |
| คาลิสติก | Kalistick เป็นแอปพลิเคชันบุคคลที่สามที่วิเคราะห์โค้ดด้วยมุมมองที่แตกต่างกัน |
| CoView และ CoAnt | ซอฟต์แวร์การเขียนโค้ดเป็นเครื่องมือครอบคลุมโค้ดสำหรับการวัด การสร้างวัตถุจำลอง การทดสอบโค้ด การครอบคลุมเส้นทางและสาขา ฯลฯ |
| เป้าสำหรับ C++ | BulseyeCoverage เป็นเครื่องมือครอบคลุมโค้ดสำหรับ C++ และซี |
| Sonar | Sonar เป็นเครื่องมือครอบคลุมโค้ดแบบเปิดซึ่งช่วยให้คุณจัดการคุณภาพของโค้ดได้ |
ข้อดีและข้อเสียของการใช้การครอบคลุมโค้ด
| ข้อดีของการครอบคลุมโค้ด | ข้อเสียของการครอบคลุมโค้ด |
|---|---|
| มีประโยชน์ในการประเมินการวัดเชิงปริมาณของการครอบคลุมโค้ด | แม้ว่าคุณลักษณะเฉพาะใดๆ จะไม่ถูกนำมาใช้ในการออกแบบ ความครอบคลุมของโค้ดยังคงรายงานความครอบคลุม 100% |
| ช่วยให้คุณสร้างกรณีทดสอบเพิ่มเติมเพื่อเพิ่มความครอบคลุมได้ | ไม่สามารถระบุได้ว่าเราได้ทดสอบค่าที่เป็นไปได้ทั้งหมดของคุณลักษณะโดยใช้การครอบคลุมโค้ดหรือไม่ |
| ช่วยให้คุณค้นหาพื้นที่ของโปรแกรมที่ไม่ได้ใช้โดยชุดกรณีทดสอบ | การครอบคลุมโค้ดไม่ได้บอกว่าคุณครอบคลุมตรรกะของคุณมากน้อยเพียงใด |
| ในกรณีที่ไม่ได้ใช้งานฟังก์ชันที่ระบุ หรือไม่ได้รวมไว้ในข้อกำหนด เทคนิคตามโครงสร้างจะไม่สามารถค้นหาปัญหาดังกล่าวได้ |
สรุป
- การครอบคลุมโค้ดเป็นการวัดที่อธิบายระดับของการทดสอบซอร์สโค้ดของโปรแกรม
- ช่วยให้คุณวัดประสิทธิภาพของการดำเนินการทดสอบ
- วิธีการครอบคลุมโค้ด 1 วิธี ได้แก่ 2.) การครอบคลุมคำชี้แจง 3.) การครอบคลุมเงื่อนไข 4) การครอบคลุมสาขา XNUMX) Toggle ความคุ้มครอง 5) ความคุ้มครอง FSM
- ความครอบคลุมของคำชี้แจงเกี่ยวข้องกับการดำเนินการของคำสั่งปฏิบัติการทั้งหมดในซอร์สโค้ดอย่างน้อยหนึ่งครั้ง
- ความครอบคลุมของการตัดสินใจจะรายงานผลลัพธ์ที่แท้จริงหรือเท็จของนิพจน์บูลีนแต่ละรายการ
- ในพื้นที่ครอบคลุมของสาขา ทุกผลลัพธ์จากโมดูลโค้ดจะถูกทดสอบ
- Conditional จะเปิดเผยวิธีประเมินตัวแปรหรือนิพจน์ย่อยในคำสั่งแบบมีเงื่อนไข
- การครอบคลุมเครื่องจักรสถานะจำกัดเป็นวิธีการครอบคลุมโค้ดที่ซับซ้อนที่สุดอย่างแน่นอน
- ในการเลือกวิธีการครอบคลุม ผู้ทดสอบจำเป็นต้องตรวจสอบค่าปรับที่อาจเกิดขึ้น การสูญเสียชื่อเสียง การสูญเสียการขาย ฯลฯ
- การครอบคลุมโค้ดจะบอกคุณว่าซอร์สโค้ดถูกใช้งานโดยม้านั่งทดสอบของคุณได้ดีเพียงใด ในขณะที่ความครอบคลุมฟังก์ชันจะวัดว่าฟังก์ชันการทำงานของการออกแบบนั้นครอบคลุมเพียงใด
- Cobertura, JTest, Clover, Emma, Kalistick เป็นเครื่องมือสำคัญในการครอบคลุมโค้ดบางส่วน
- Code Coverage ช่วยให้คุณสร้างกรณีทดสอบเพิ่มเติมเพื่อเพิ่มความครอบคลุมได้
- การครอบคลุมโค้ดไม่ได้ช่วยให้คุณพิจารณาว่าเราได้ทดสอบค่าที่เป็นไปได้ทั้งหมดของฟีเจอร์หรือไม่













