Bazel มีคําสั่งย่อย coverage
เพื่อสร้างรายงานการครอบคลุมของโค้ดในที่เก็บซึ่งทดสอบด้วย bazel coverage
ได้ เนื่องจากมีระบบนิเวศที่แตกต่างกันตามระบบนิเวศของภาษาต่างๆ จึงอาจไม่ใช่การทําให้โปรเจ็กต์นี้ได้ผลเสมอไป
หน้านี้บันทึกขั้นตอนทั่วไปสําหรับการสร้างและดูรายงานการครอบคลุม และยังมีหมายเหตุเฉพาะภาษาสําหรับภาษาที่รู้จักการกําหนดค่าด้วย ซึ่งควรอ่านโดยอ่านส่วนทั่วไปก่อน จากนั้นจึงอ่านข้อกําหนดสําหรับข้อกําหนดสําหรับภาษาใดภาษาหนึ่ง และโปรดทราบส่วนการดําเนินการระยะไกล ซึ่งต้องมีข้อควรพิจารณาเพิ่มเติมด้วย
แม้ว่าคุณจะปรับแต่งได้มากมาย แต่เอกสารนี้จะมุ่งเน้นที่การสร้างและการใช้รายงาน lcov
ซึ่งปัจจุบันเป็นเส้นทางที่รองรับมากที่สุด
การสร้างรายงานการครอบคลุม
การจัดเตรียม
ขั้นตอนพื้นฐานในการสร้างรายงานการครอบคลุมมีดังนี้
- ที่เก็บพื้นฐานที่มีเป้าหมายการทดสอบ
- เครื่องมือเครื่องมือที่ติดตั้งเครื่องมือครอบคลุมโค้ดเฉพาะภาษา
- การกําหนดค่า "การวัดค่า" ที่ถูกต้อง
โปรแกรม 2 ส่วนนี้จะเจาะจงภาษาและส่วนใหญ่เป็นเอกสารที่ตรงไปตรงมา แต่โปรเจ็กต์หลังอาจทําได้ยากกว่า
"การใช้เครื่องมือ" ในที่นี้หมายถึงเครื่องมือครอบคลุมที่ใช้สําหรับเป้าหมายเฉพาะ Bazel อนุญาตให้เปิดการตั้งค่านี้สําหรับชุดย่อยของไฟล์ที่เจาะจงโดยใช้แฟล็ก
--instrumentation_filter
ซึ่งระบุตัวกรองสําหรับเป้าหมายที่ทดสอบเมื่อเปิดใช้เครื่องมือไว้ หากต้องการเปิดใช้คุมสอบสําหรับการทดสอบ คุณจําเป็นต้องมี--instrument_test_targets
แฟล็ก
โดยค่าเริ่มต้น Bazel จะพยายามจับคู่แพ็กเกจเป้าหมายและพิมพ์ตัวกรองที่เกี่ยวข้องเป็นข้อความ INFO
การครอบคลุมของวิ่ง
หากต้องการสร้างรายงานการครอบคลุม ให้ใช้ bazel coverage
--combined_report=lcov
[target]
การดําเนินการนี้จะทดสอบเป้าหมาย โดยสร้างรายงานการครอบคลุมในรูปแบบ lcov สําหรับแต่ละไฟล์
เมื่อเสร็จเรียบร้อยแล้ว Bazel จะเรียกใช้การดําเนินการที่รวบรวมไฟล์หน้าปกทั้งหมดที่สร้างขึ้นและรวมไฟล์เหล่านั้นเข้าด้วยกัน จากนั้นจะสร้างขึ้นภายใต้ $(bazel info
output_path)/_coverage/_coverage_report.dat
นอกจากนี้จะมีการรายงานการครอบคลุมด้วยหากการทดสอบล้มเหลว อย่างไรก็ตาม การดําเนินการนี้ไม่รวมถึงการทดสอบที่ล้มเหลว แต่จะรายงานเฉพาะการทดสอบที่ผ่านเท่านั้น
กําลังดูความครอบคลุม
รายงานการครอบคลุมจะส่งออกในรูปแบบ lcov
ที่มนุษย์อ่านไม่ได้เท่านั้น เราใช้ยูทิลิตี genhtml
(ส่วนหนึ่งของโปรเจ็กต์ LCov) เพื่อสร้างรายงานที่ดูได้ในเว็บเบราว์เซอร์ ดังนี้
genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
โปรดทราบว่า genhtml
จะอ่านซอร์สโค้ดด้วยเช่นกันเพื่อใส่คําอธิบายประกอบที่ขาดหายไปในไฟล์เหล่านี้ ขั้นตอนนี้เพื่อให้เป็นไปตามที่คาดไว้: genhtml
จะดําเนินการในรูทของโปรเจ็กต์ Bazel
ดูผลลัพธ์โดยเปิดไฟล์ index.html
ที่สร้างขึ้นในไดเรกทอรี genhtml
ในเว็บเบราว์เซอร์
ดูความช่วยเหลือเพิ่มเติมและข้อมูลเกี่ยวกับเครื่องมือ genhtml
หรือรูปแบบการครอบคลุมของ lcov
ได้ที่โปรเจ็กต์ LCov
การดําเนินการระยะไกล
การใช้งานการทดสอบระยะไกลในปัจจุบันมีข้อควรระวังอยู่ 2-3 ข้อดังนี้
- ชุดค่าผสมของรายงานยังเรียกใช้จากระยะไกลไม่ได้ นั่นเป็นเพราะ Bazel ไม่ถือว่าไฟล์เอาต์พุตที่ครอบคลุมนั้นเป็นส่วนหนึ่งของกราฟ (ดูปัญหานี้) จึงถือว่าข้อผิดพลาดเหล่านี้เป็นอินพุตสําหรับการดําเนินการรวมไม่ได้ โปรดใช้
--strategy=CoverageReport=local
เพื่อแก้ไขปัญหานี้- หมายเหตุ: คุณอาจต้องระบุข้อมูลบางอย่าง เช่น
--strategy=CoverageReport=local,remote
แทน หาก Bazel ตั้งค่าให้ลองใช้local,remote
เนื่องจาก Bazel แก้ปัญหากลยุทธ์ได้
- หมายเหตุ: คุณอาจต้องระบุข้อมูลบางอย่าง เช่น
--remote_download_minimal
และแฟล็กที่คล้ายกันยังใช้เป็นผลของอดีตไม่ได้- ปัจจุบัน Bazel จะสร้างข้อมูลการครอบคลุมไม่ได้หากแคชแคชไว้ก่อนหน้านี้ วิธีแก้ปัญหานี้คือ
ตั้งค่า
--nocache_test_results
สําหรับการเรียกใช้การครอบคลุมโดยเฉพาะได้ ทั้งๆ ที่การทําเช่นนี้มีค่าใช้จ่ายมากในแง่ของเวลาทดสอบ --experimental_split_coverage_postprocessing
และ--experimental_fetch_all_coverage_outputs
- โดยปกติแล้ว การครอบคลุมจะทํางานเป็นส่วนหนึ่งของการดําเนินการทดสอบ ดังนั้นโดยค่าเริ่มต้น เราจะไม่ครอบคลุมทุกส่วนกลับมาเป็นผลของการดําเนินการระยะไกลโดยค่าเริ่มต้น แฟล็กเหล่านี้จะลบล้างค่าเริ่มต้นและรับข้อมูลการครอบคลุม ดูรายละเอียดเพิ่มเติมได้ที่ปัญหานี้
การกําหนดค่าเฉพาะภาษา
Java
Java ควรใช้งานทันทีที่กําหนดค่าเริ่มต้น เชนเครื่องมือBazel มีทุกอย่างที่จําเป็นต่อการดําเนินการจากระยะไกล รวมถึง JUnit
Python
ดูขั้นตอนเพิ่มเติมที่จําเป็นเพื่อเปิดใช้การรองรับการครอบคลุมใน Python ได้ในเอกสารความครอบคลุมของ rules_python