การครอบคลุมโค้ดคืออะไรและคุณวัดได้อย่างไร


275

การครอบคลุมโค้ดคืออะไรและคุณวัดได้อย่างไร

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

คำตอบ:


242

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

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

ทีมของเราใช้Magellan - ชุดเครื่องมือครอบคลุมรหัส หากคุณเป็นร้านค้า. NET Visual Studio มีเครื่องมือในการรวบรวมความครอบคลุมโค้ด คุณสามารถม้วนเครื่องมือที่กำหนดเองได้เช่นบทความนี้อธิบาย

หากคุณเป็นร้าน C ++ Intel มีเครื่องมือบางอย่างที่ใช้งานได้กับ Windows และ Linux แม้ว่าฉันจะไม่ได้ใช้ก็ตาม ฉันเคยได้ยินว่ามีเครื่องมือ gcov สำหรับ GCC แต่ฉันไม่รู้อะไรเกี่ยวกับมันและไม่สามารถให้ลิงก์แก่คุณได้

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

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


40
"มีตัวชี้วัดอื่น ๆ ที่คุณควรใช้พร้อมกับการครอบคลุมโค้ดเพื่อให้มั่นใจในคุณภาพ" คุณช่วยบอกได้ว่าเมตริกอื่น ๆ เหล่านี้คืออะไร?
ทหาร

นอกจากนี้คุณยังสามารถใช้Testwell CTC ++เป็นเครื่องมือครอบคลุมรหัสที่สมบูรณ์แบบสำหรับ C, C ++, C # และ Java
B_PRIEUR

1
@Abdul เมื่อคุณทำการวัดรหัสครอบคลุมคุณควรทำการทดสอบทั้งสองแบบและทำการวัดความครอบคลุมโค้ดให้แยกต่างหาก สำหรับ "arcs of code" - เหล่านี้คือกิ่งการประมวลผลโค้ดเช่นถ้า / แล้ว
Franci Penov

1
@Maverick คนส่วนใหญ่ถือว่าการทดสอบหน่วยเมื่อพูดถึงการครอบคลุมโค้ดอย่างไรก็ตามที่ Microsoft เรากำลังวัดการครอบคลุมโค้ดจากการทดสอบหน่วยและการทดสอบการรวมเข้าด้วยกัน
Franci Penov

1
@darth_coder ไม่มีอะไรโดยทั่วไป แอพจะไม่ถูกใช้งานโดยอัตโนมัติเช่นกันและหากไม่มีสิ่งใดที่รวบรวมข้อมูลการใช้งานแอปใหม่จะไม่เกี่ยวข้อง กรณีเดียวที่อาจส่งผลกระทบต่อสิ่งต่าง ๆ คือหากแอปทำงานในเวลาเดียวกันขณะที่การทดสอบอัตโนมัติกำลังทำงานและทำให้รหัสระบบปฏิบัติการที่เรียกใช้ภายในกระบวนการเดียวกับระบบทดสอบอัตโนมัติซึ่งอาจแสดงรหัส OS บางอย่างที่กำลังทำงาน ไม่ได้สัมผัสโดยการทดสอบ
Franci Penov

189

โดยทั่วไปการครอบคลุมรหัสจะทดสอบว่าจำนวนรหัสของคุณครอบคลุมภายใต้การทดสอบ ดังนั้นหากคุณมีการครอบคลุมโค้ด 90% หมายความว่ามีโค้ด 10% ที่ไม่ครอบคลุมในการทดสอบ ฉันรู้ว่าคุณอาจคิดว่า 90% ของรหัสครอบคลุม แต่คุณต้องมองจากมุมที่แตกต่าง คุณกำลังหยุดรับรหัสครอบคลุม 100% อะไร

ตัวอย่างที่ดีคือ:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

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

NCoverเป็นเครื่องมือที่ดีในการวัดความครอบคลุมรหัส


5
คำตอบที่ดีที่สุดเมื่อเกือบ 10 ปีที่แล้ว! ประณาม! :)
Nikos

4
ที่เรียบง่ายและมีความหมายคำตอบ :)
Parveen

ใช่. คนเดียวที่เข้าท่า แม้ว่าฉันจะไม่ได้เลื่อนลงไปอีก นี่คือที่ฉันหยุด บุ๊คมาร์ค
TheRealChx101

64

เพียงจำไว้ว่าการมี "การครอบคลุมรหัส 100%" ไม่ได้หมายความว่าทุกอย่างผ่านการทดสอบอย่างสมบูรณ์ - ในขณะที่มันหมายถึงทุกบรรทัดของการทดสอบนั้นไม่ได้หมายความว่าพวกเขาจะถูกทดสอบในทุกสถานการณ์ (ทั่วไป) ..

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

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


1
- "การครอบคลุมโค้ด 100%" ไม่ได้หมายความว่าทุกอย่างผ่านการทดสอบอย่างสมบูรณ์ - ในขณะที่มันหมายถึงทุกบรรทัดของการทดสอบนั้นไม่ได้หมายความว่าพวกเขาจะถูกทดสอบในทุกสถานการณ์ (ทั่วไป) .. - "ภายใต้ทุก (ทั่วไป) สถานการณ์ "นี่คือเกี่ยวกับการป้อนข้อมูลและพารามิเตอร์? ฉันมีปัญหาในการทำความเข้าใจว่าทำไมถ้าทุกอย่างผ่านการทดสอบมันไม่เท่ากับการทดสอบอย่างสมบูรณ์
อับดุล

20
เพียงเพราะทุกบรรทัดของรหัสของคุณทำงานในบางจุดในการทดสอบของคุณก็ไม่ได้หมายความว่าคุณได้ทดสอบทุกสถานการณ์ที่เป็นไปได้ที่รหัสสามารถทำงานได้ หากคุณเพิ่งมีฟังก์ชั่นที่รับxและส่งคืนx/xและคุณรันการทดสอบโดยใช้ my_func (2) คุณจะได้รับความครอบคลุม 100% (เนื่องจากโค้ดของฟังก์ชันจะถูกเรียกใช้) แต่คุณพลาดปัญหาใหญ่ไปเมื่อพารามิเตอร์ 0 คือ นั่นคือคุณยังไม่ได้ทดสอบสถานการณ์ที่จำเป็นทั้งหมดแม้จะครอบคลุม 100%
สตีฟ

คุณช่วยกรุณาดูสถานการณ์นี้เมื่อกรณีทดสอบหน่วยไม่ได้เขียนขึ้นสำหรับวิธีการทั้งหมด รหัสครอบคลุมจะยังคง 100% stackoverflow.com/questions/43395968/…
Sachin Kumar

52

การรวมคะแนนสองสามคะแนนกับคำตอบก่อนหน้านี้จำนวนมาก:

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

ดังที่กล่าวไว้ในคำตอบข้างต้นมีเกณฑ์การครอบคลุมต่าง ๆ เช่นเส้นทาง, เงื่อนไข, ฟังก์ชั่น, งบ, ฯลฯ แต่เกณฑ์เพิ่มเติมที่จะครอบคลุมคือ

  1. การครอบคลุมของเงื่อนไข: นิพจน์บูลีนทั้งหมดที่ต้องประเมินสำหรับจริงและเท็จ
  2. ความครอบคลุมในการตัดสินใจ: ไม่ใช่เพียงแค่นิพจน์บูลีนที่จะถูกประเมินสำหรับความจริงและเท็จเพียงครั้งเดียว แต่เพื่อครอบคลุมเนื้อหา if-elseif-else ที่ตามมาทั้งหมด
  3. การครอบคลุมแบบวนซ้ำ: หมายถึงการวนซ้ำทุกครั้งที่เป็นไปได้ถูกดำเนินการหนึ่งครั้งมากกว่าหนึ่งครั้งและเวลาเป็นศูนย์ นอกจากนี้หากเรามีข้อสันนิษฐานเกี่ยวกับขีด จำกัด สูงสุดถ้าเป็นไปได้ให้ทดสอบเวลา จำกัด สูงสุดและหนึ่งครั้งมากกว่าขีด จำกัด สูงสุด
  4. ครอบคลุมการเข้าและออก: ทดสอบการโทรที่เป็นไปได้และค่าการส่งคืน
  5. การครอบคลุมค่าพารามิเตอร์ (PVC) ในการตรวจสอบว่ามีการทดสอบค่าที่เป็นไปได้ทั้งหมดสำหรับพารามิเตอร์หรือไม่ ตัวอย่างเช่นสตริงอาจเป็นสิ่งเหล่านี้โดยทั่วไป: a) null, b) ว่างเปล่า c) ช่องว่าง (ช่องว่างแท็บบรรทัดใหม่), d) สตริงที่ถูกต้อง e) สตริงที่ไม่ถูกต้อง f) สตริงไบต์เดียว, g ) สตริงไบต์คู่ ความล้มเหลวในการทดสอบแต่ละค่าพารามิเตอร์ที่เป็นไปได้อาจทำให้เกิดข้อบกพร่อง การทดสอบเพียงหนึ่งในสิ่งเหล่านี้อาจส่งผลให้ครอบคลุมรหัส 100% เนื่องจากแต่ละบรรทัดได้รับการครอบคลุม แต่เนื่องจากมีการทดสอบตัวเลือกเพียงหนึ่งในเจ็ดตัวเลือกเท่านั้นหมายความว่าครอบคลุมเพียง 14.2% ของค่าพารามิเตอร์
  6. ความครอบคลุมของการสืบทอด: ในกรณีของแหล่งที่มาของวัตถุเมื่อส่งคืนวัตถุที่ได้รับซึ่งอ้างอิงโดยคลาสฐานความครอบคลุมในการประเมินถ้าส่งคืนวัตถุพี่น้องควรถูกทดสอบ

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


2
นอกจากนี้ที่นี่เพื่อคำตอบอื่น ๆ
HDave

15

รหัสครอบคลุมได้รับการอธิบายอย่างดีในคำตอบก่อนหน้า นี่เป็นคำตอบที่มากกว่าในส่วนที่สองของคำถาม

เราใช้เครื่องมือสามตัวเพื่อพิจารณาความครอบคลุมของรหัส

  1. JTest - เครื่องมือที่เป็นกรรมสิทธิ์ซึ่งสร้างขึ้นบน JUnit (มันสร้างการทดสอบหน่วยเช่นกัน)
  2. Cobertura - เครื่องมือครอบคลุมโค้ดโอเพนซอร์ซที่สามารถจับคู่กับ JUnit เพื่อสร้างรายงาน
  3. Emma - อันอื่น - อันนี้เราใช้เพื่อจุดประสงค์ที่แตกต่างจากการทดสอบหน่วยเล็กน้อย มันถูกใช้เพื่อสร้างรายงานความครอบคลุมเมื่อผู้ใช้ปลายทางเข้าถึงเว็บแอปพลิเคชัน ควบคู่ไปกับเครื่องมือทดสอบเว็บ (ตัวอย่าง: Canoo) สามารถให้รายงานความครอบคลุมที่มีประโยชน์มากซึ่งจะบอกให้คุณทราบถึงจำนวนโค้ดที่ครอบคลุมในระหว่างการใช้งานของผู้ใช้ทั่วไป

เราใช้เครื่องมือเหล่านี้เพื่อ

  • ตรวจสอบว่าผู้พัฒนาได้เขียนการทดสอบหน่วยที่ดี
  • ตรวจสอบให้แน่ใจว่ามีการสำรวจรหัสทั้งหมดในระหว่างการทดสอบกล่องดำ

6

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

เท่าที่ฉันจะติดตามการทดสอบครอบคลุมหน่วยในโครงการของฉันฉันใช้เครื่องมือวิเคราะห์รหัสคงที่เพื่อติดตาม


5

สำหรับ Perl มีโมดูลDevel :: Cover ที่ยอดเยี่ยมซึ่งฉันใช้เป็นประจำกับโมดูลของฉัน

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


1

ในคำตอบก่อนหน้าครอบคลุมรหัสได้รับการอธิบายอย่างดี ฉันแค่เพิ่มความรู้ที่เกี่ยวข้องกับเครื่องมือหากคุณกำลังทำงานiOSและOSXแพลตฟอร์ม Xcode ให้ความสะดวกในการทดสอบและตรวจสอบความครอบคลุมรหัส

ลิงค์อ้างอิง:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

ทั้งสองเป็นลิงก์ที่มีประโยชน์สำหรับการเรียนรู้และสำรวจการครอบคลุมโค้ดด้วย Xcode


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.