Bazel 具有 coverage
子指令,藉此產生程式碼涵蓋率
可針對可以使用 bazel coverage
測試的存放區製作報表。應付款項
這些語言生態系統的慣用語言
為指定專案完成這項工作
本頁說明一般建立及檢視的一般程序 涵蓋範圍報表,並列出 並且設定大家都知道的語言。最好先閱讀 參閱一般部分, 請參閱特定語言的相關規定同時請注意 遠端執行一節,需要 其他事項。
雖然您有許多自訂選項,但本文重點放在
必須產生及使用 lcov
報表
是最完備的路線
建立涵蓋率報表
準備
建立涵蓋率報表的基本工作流程需要 包括:
- 具有測試目標的基本存放區
- 已安裝特定語言程式碼涵蓋率工具的工具鍊
- 正確的「檢測服務」設定
前者會特別指定語言,且最易於理解。 但前者對複雜的專案而言可能比較困難。
「Instrumentation」在本例中是涵蓋範圍工具
特定指標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 --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
請注意,genhtml
也會讀取原始碼,為缺少的註解加上註解
涵蓋範圍。為了達到這個目的,我們認為
genhtml
會在 bazel 專案的根目錄中執行。
如要查看結果,只需開啟index.html
genhtml
目錄。
如需 genhtml
工具的進一步協助和資訊,或
lcov
涵蓋範圍格式,請參閱 lcov 專案。
遠端執行
透過遠端測試執行作業執行目前有一些注意事項:
- 報表組合動作目前無法遠端執行。這是
因為 Bazel 不會將涵蓋率輸出檔案納入考量
圖表 (請參閱這個問題),
未正確當做組合動作的輸入值。目的地:
解決該問題,請使用
--strategy=CoverageReport=local
。- 注意: 您可能需要指定
如果已設定 Bazel,請改為使用
--strategy=CoverageReport=local,remote
最多嘗試local,remote
,因為 Bazel 會解析策略。
- 注意: 您可能需要指定
如果已設定 Bazel,請改為使用
- 您也無法再使用
--remote_download_minimal
和類似標記 版本。 - 如果執行測試,Bazel 目前就無法建立涵蓋率資訊
代表之前已快取過如要解決這個問題
--nocache_test_results
您可以為涵蓋率 但這當然需要投入大量的測試成本。 - 「
--experimental_split_coverage_postprocessing
」和--experimental_fetch_all_coverage_outputs
- 通常涵蓋率是測試動作的一部分,因此 在預設情況下,我們無法將所有覆蓋率恢復為遙控器的輸出內容 預設執行這些旗標會覆寫預設值 涵蓋範圍資料。詳情請參閱這個問題 詳細資料。
特定語言設定
Java
Java 應採用預設設定,立即運作。 bazel 工具鍊包含 遠端執行,包括 JUnit
Python
必要條件
使用 Python 執行涵蓋範圍,需要滿足一些先決條件:
- 包含 b01c859 的 bazel 二進位檔 任何 Bazel 都必須大於 3.0
- 已修改的 Coverage.py 版本。
使用已修改的 Coverage.py
方法是透過 rules_python,
使用 requirements.txt
檔案的能力,必須符合下列必要條件
會進一步使用
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",
)
然後,測試目標就可以利用 Coverage.py 要求
在 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
目標的依附元件,可以改為新增涵蓋率工具
工具鍊設定。
因為 pip_install 規則需要使用 Python
工具鍊,無法用來擷取 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",
],
)
然後將 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",
)