Bazel によるコード カバレッジ

<ph type="x-smartling-placeholder"></ph> 問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 が試行されます。
  • --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 でカバレッジを実行するには、いくつかの前提条件があります。

変更した scope.py の使用

これを行うには rules_python を使用します。これにより、 requirements.txt ファイルを使用する機能、要件のリスト 次に、 pip_install リポジトリ ルール。

requirements.txt のエントリは次のようになります。

git+https://github.com/ulfjack/coveragepy.git@lcov-support

rules_pythonpip_installrequirements.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",
)