Bazel には、コード カバレッジを生成する coverage
サブコマンドがあります
bazel coverage
でテストできるリポジトリに関するレポート。期限
さまざまな言語エコシステムの特異性にかかわるものですが、
特定のプロジェクトでこれを行うのは簡単です。
このページでは、Google Cloud Storage バケットを レポートについても、言語ごとの説明 よく知られた言語の人だけが使用できます。最初に読むことをおすすめします 全般的なセクションを読んでから 特定の言語の要件を確認してくださいまた、 リモート実行セクション。いくつかの 考慮事項を確認します
さまざまなカスタマイズが可能ですが、このドキュメントでは、
lcov
レポートの作成と使用が可能です。
ルートの 1 つです
カバレッジ レポートを作成する
準備
カバレッジ レポートを作成する基本的なワークフローでは、 次のとおりです。
- テスト ターゲットを含む基本的なリポジトリ
- 言語固有のコード カバレッジ ツールがインストールされたツールチェーン
- 正しい「計測」構成
前者の 2 つは言語固有でほとんどがわかりやすいものです 複雑なプロジェクトでは後者の方が 難しい場合があります
"インストルメンテーション"カバレッジツールは
使用されます。Bazel を使用すると、
サブセットを 1 つに
--instrumentation_filter
フラグ。
インストルメンテーションが有効になっていることを確認しますテストでインストルメンテーションを有効にするには、
--instrument_test_targets
フラグは必須です。
デフォルトでは、bazel はターゲット パッケージの照合を試み、
INFO
メッセージとして返すことができます。
実行中のカバレッジ
カバレッジ レポートを作成するには、bazel coverage
--combined_report=lcov
[target]
を使用します。これにより、
ターゲットのテスト、lcov 形式でのカバレッジ レポートの生成
おすすめします。
完了したら、Bazel は生成されたすべての
1 つにマージします
$(bazel info
output_path)/_coverage/_coverage_report.dat
に作成。
テストが失敗した場合でもカバレッジ レポートが生成されますが、 不合格になったテストはこれにとどまりません。合格したテストのみが 報告されます。
カバレッジの表示
カバレッジ レポートは、人間が読み取れない lcov
でのみ出力されます。
使用できます。ここから、genhtml
ユーティリティ(lcov の一部)を
プロジェクト)を使用して、ウェブで表示できるレポートを作成します。
browser:
genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
genhtml
はソースコードも読み取って、欠損値にアノテーションを付けます。
です。これが機能するには、次のことが期待されます。
genhtml
は bazel プロジェクトのルートで実行されます。
結果を表示するには、Terraform で生成された index.html
ファイルを開くだけです。
任意のウェブブラウザの genhtml
ディレクトリ。
genhtml
ツールに関するその他のヘルプと情報については、
lcov
カバレッジ形式については、lcov プロジェクトをご覧ください。
リモート実行
現在、リモートテスト実行で実行する場合、いくつかの注意点があります。
- レポートの組み合わせの操作はまだリモートで実行できません。これは、
Bazel では、カバレッジ出力ファイルが
(この問題を参照)、
組み合わせアクションへの入力として正しく扱いません。宛先
--strategy=CoverageReport=local
を使用してください。- 注: 次のように指定する必要がある場合があります。
Bazel が設定されている場合、代わりに
--strategy=CoverageReport=local,remote
Bazel によるストラテジーの解決により、local,remote
が試行されます。
- 注: 次のように指定する必要がある場合があります。
Bazel が設定されている場合、代わりに
--remote_download_minimal
などのフラグは使用できません。 影響しています- テストを行うと、Bazel は現在、カバレッジ情報の作成に失敗します。
キャッシュに保存されています。この問題を回避するには
--nocache_test_results
は、カバレッジ実行専用に設定できます。 ただし テスト時間の面で大きなコストがかかります --experimental_split_coverage_postprocessing
、--experimental_fetch_all_coverage_outputs
<ph type="x-smartling-placeholder">- </ph>
- 通常、カバレッジはテスト アクションの一環として実行されるため、 デフォルトでは、すべてのカバレッジがリモート リソースの出力として返されるわけではありません。 実行されています。これらのフラグはデフォルトをオーバーライドし、 適用範囲データを抽出できます。詳しくは、この問題をご覧ください。 表示されます。
言語固有の構成
Java
Java は、デフォルトの構成ですぐに使用できます。「 bazel ツールチェーンには、移行に必要なすべてのものが リモート実行にも対応しています
Python
前提条件
Python でカバレッジを実行するには、いくつかの前提条件があります。
- b01c859 を含む bazel バイナリ。 Bazel 3.0 以上である必要があります。
- coverage.py の修正版。
変更した scope.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",
)