การครอบคลุมของโค้ดด้วย Bazel

รายงานปัญหา ดูแหล่งที่มา

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