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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel มีคำสั่งย่อย coverage เพื่อสร้างการครอบคลุมโค้ด ในที่เก็บซึ่งทดสอบด้วย bazel coverage ได้ ครบกำหนด ความแปลกแยกของระบบนิเวศทางภาษาต่างๆ มันไม่ใช่ ทำให้ได้ผลสำหรับโครงการนั้นๆ เสมอ

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

แม้ว่าจะสามารถปรับแต่งได้มากมาย แต่เอกสารนี้มุ่งเน้นไปที่ สร้างและใช้รายงาน lcov ซึ่งปัจจุบันเป็น ที่ได้รับการสนับสนุนเป็นอย่างดี

การสร้างรายงานความครอบคลุม

การเตรียมพร้อม

เวิร์กโฟลว์พื้นฐานสำหรับการสร้างรายงานความครอบคลุมจำเป็นต้องใช้ ดังต่อไปนี้:

  • ที่เก็บพื้นฐานที่มีเป้าหมายทดสอบ
  • เครื่องมือเชนที่ติดตั้งเครื่องมือการครอบคลุมของโค้ดเฉพาะภาษา
  • "การวัดคุม" ที่ถูกต้อง การกำหนดค่า

สองอย่างแรกจะเจาะจงภาษาและค่อนข้างตรงไปตรงมา แต่แผนการหลังอาจเป็นเรื่องยากสำหรับโปรเจ็กต์ที่ซับซ้อน

"การวัดคุม" ในกรณีนี้หมายถึงเครื่องมือความคุ้มครองที่ ที่ใช้สำหรับเป้าหมายเฉพาะ Bazel อนุญาตให้เปิดการตั้งค่าสำหรับ ชุดย่อยที่เจาะจงโดยใช้ --instrumentation_filter Flag ซึ่งระบุตัวกรองสำหรับเป้าหมายที่มีการทดสอบด้วยฟังก์ชัน เปิดใช้การวัดคุมแล้ว ในการเปิดใช้การใช้เครื่องมือสำหรับการทดสอบ พารามิเตอร์ --instrument_test_targets ต้องระบุแฟล็ก

โดยค่าเริ่มต้น bazel จะพยายามจับคู่แพ็กเกจเป้าหมาย แล้วพิมพ์ ตัวกรองที่เกี่ยวข้องเป็นข้อความINFO

การรายงานข่าว

หากต้องการสร้างรายงานการครอบคลุม ให้ใช้ bazel coverage --combined_report=lcov [target] ซึ่งเรียกใช้เมธอด การทดสอบสำหรับเป้าหมาย ซึ่งจะสร้างรายงานการครอบคลุมในรูปแบบ lcov กับแต่ละไฟล์

เมื่อทำเสร็จแล้ว เขาจะทำการกระทำที่รวบรวมเนื้อหาที่ผลิตทั้งหมด การครอบคลุมทั้งหมด และรวมไฟล์เหล่านั้นเป็นไฟล์เดียว ซึ่งสุดท้ายแล้ว สร้างภายใต้ $(bazel info output_path)/_coverage/_coverage_report.dat

ระบบจะสร้างรายงานการครอบคลุมด้วยหากการทดสอบล้มเหลว แต่โปรดทราบว่า แต่ไม่รวมถึงการทดสอบที่ไม่ผ่าน เพียงแต่การทดสอบที่ผ่าน รายงานแล้ว

การรายงานข่าว

รายงานการครอบคลุมจะแสดงผลในรูปแบบ lcov ที่มนุษย์อ่านไม่ได้เท่านั้น จากข้อมูลนี้ เราจะใช้ยูทิลิตี genhtml (ส่วนหนึ่งของ lcov ) เพื่อสร้างรายงานที่ดูได้ในเว็บ เบราว์เซอร์:

genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"

โปรดทราบว่า genhtml จะอ่านซอร์สโค้ดด้วยเพื่อกำหนดคำอธิบายประกอบที่ขาดหายไป ความครอบคลุมในไฟล์เหล่านี้ การจะได้ผลนี้ เราคาดว่า ดำเนินการ genhtml ในรูทของโปรเจ็กต์ bazel

หากต้องการดูผลลัพธ์ เพียงเปิดไฟล์ index.html ที่สร้างขึ้นใน ไดเรกทอรี genhtml ในเว็บเบราว์เซอร์ใดก็ได้

หากต้องการความช่วยเหลือและข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือ genhtml หรือ รูปแบบการครอบคลุมของlcov ดูโปรเจ็กต์ lcov

การดำเนินการจากระยะไกล

การเรียกใช้ด้วยการดำเนินการทดสอบระยะไกลมีข้อควรระวังบางประการในขณะนี้ ได้แก่

  • ยังเรียกใช้ชุดค่าผสมรายงานจากระยะไกลไม่ได้ นี่คือ เนื่องจาก 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 Toolchains ยังมีทุกอย่างที่จำเป็นต่อการ การดำเนินการจากระยะไกล ซึ่งรวมถึง JUnit ด้วย

Python

ดูrules_pythonเอกสารการครอบคลุม เพื่อดูขั้นตอนเพิ่มเติมที่จำเป็นในการเปิดใช้การสนับสนุนการครอบคลุมใน Python