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
ข้อกำหนดเบื้องต้น
การเรียกใช้การครอบคลุมด้วย Python มีข้อกำหนดเบื้องต้นดังนี้
- ไบนารี Bazel ที่มี b01c859 ซึ่งควรเป็น Bazel >3.0 ใดก็ได้
- cover.py เวอร์ชันที่แก้ไขแล้ว
การใช้ Reporting.py ที่แก้ไข
วิธีดำเนินการนี้โดยใช้ rules_python ซึ่งจะให้
ความสามารถในการใช้ไฟล์ requirements.txt
ตามข้อกำหนดที่ระบุไว้
ในไฟล์ถูกสร้างเป็นเป้าหมายแบบ bazel โดยใช้
กฎที่เก็บ pip_install
requirements.txt
ควรมีรายการต่อไปนี้
git+https://github.com/ulfjack/coveragepy.git@lcov-support
ควรใช้ไฟล์ rules_python
, pip_install
และ requirements.txt
ในไฟล์ WORKSPACE ในรูปแบบต่อไปนี้
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_python",
url = "https://github.com/bazelbuild/rules_python/releases/download/0.5.0/rules_python-0.5.0.tar.gz",
sha256 = "cd6730ed53a002c56ce4e2f396ba3b3be262fd7cb68339f0377a45e8227fe332",
)
load("@rules_python//python:pip.bzl", "pip_install")
pip_install(
name = "python_deps",
requirements = "//:requirements.txt",
)
จากนั้นเป้าหมายทดสอบจะสามารถใช้ข้อกำหนด ครอบคุมโดย
กำลังตั้งค่าต่อไปนี้ในไฟล์ BUILD
load("@python_deps//:requirements.bzl", "entry_point")
alias(
name = "python_coverage_tools",
actual = entry_point("coverage"),
)
py_test(
name = "test",
srcs = ["test.py"],
env = {
"PYTHON_COVERAGE": "$(location :python_coverage_tools)",
},
deps = [
":main",
":python_coverage_tools",
],
)
หากคุณใช้เครื่องมือเชน Python แบบหลายชั้น แทนที่จะเพิ่มการครอบคลุม
ขึ้นอยู่กับเป้าหมาย py_test
ทุกรายการซึ่งคุณอาจเพิ่มเครื่องมือการครอบคลุมแทนได้
การกำหนดค่า Toolchain
เนื่องจากกฎ pip_install จะขึ้นอยู่กับ Python
Toolchain นั้นไม่สามารถใช้เพื่อดึงโมดูล coverage
ได้
แต่ให้เพิ่ม WORKSPACE
แทน เช่น
http_archive(
name = "coverage_linux_x86_64"",
build_file_content = """
py_library(
name = "coverage",
srcs = ["coverage/__main__.py"],
data = glob(["coverage/*", "coverage/**/*.py"]),
visibility = ["//visibility:public"],
)
""",
sha256 = "84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3",
type = "zip",
urls = [
"https://files.pythonhosted.org/packages/74/0d/0f3c522312fd27c32e1abe2fb5c323b583a5c108daf2c26d6e8dfdd5a105/coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
],
)
จากนั้นกำหนดค่า Toolchain ของ Python เช่น
py_runtime(
name = "py3_runtime_linux_x86_64",
coverage_tool = "@coverage_linux_x86_64//:coverage",
files = ["@python3_9_x86_64-unknown-linux-gnu//:files"],
interpreter = "@python3_9_x86_64-unknown-linux-gnu//:bin/python3",
python_version = "PY3",
)
py_runtime_pair(
name = "python_runtimes_linux_x86_64",
py2_runtime = None,
py3_runtime = ":py3_runtime_linux_x86_64",
)
toolchain(
name = "python_toolchain_linux_x86_64",
exec_compatible_with = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
toolchain = ":python_runtimes_linux_x86_64",
toolchain_type = "@bazel_tools//tools/python:toolchain_type",
)