概要

このセクションでは、C/C++test と Bazel ビルドを統合し、静的解析およびコード カバレッジの収集を行う方法を説明します。

Bazel のコード カバレッジ収集は、現時点では完全にはサポートされておらず、試験的機能です。

要件

  • C/C++test がインストールされていること
  • Bazel version 4.0+
  • Linux のみ

C/C++test を Bazel のローカル リポジトリとして追加する

C/C++test をインストールしただけの状態では、Bazel ローカル リポジトリとして動作しません。次の手順に従って、C/C++test を Bazel のローカル リポジトリとして追加します。

  1. C/C++test インストール ディレクトリの integration/bazel ディレクトリにある WORKSPACE.bazel および BUILD.bazel ファイルをインストール ディレクトリの直下に移動します。
  2. プロジェクトのルートにある Bazel WORKSPACE ファイルを開きます。
  3. Bazel WORKSPACE ファイルに次の記述を追加します (C/C++test のインストール ディレクトリに合わせてパスを変更してください)。

    local_repository(name = "cpptest", path = "/opt/parasoft/cpptest")

BDF 生成ルールの登録

Bazel が BDF の生成を実行するには、テスト対象の cc_library または cc_binary がある BUILD ファイルにルールを追加する必要があります。たとえば、次の Bazel BUILD ファイルがあり、"hello-world" cc_binary ルールの BDF を生成するとします。

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
    ],
)

次の手順に従って Bazel での BDF 生成を登録します。

  1. C/C++test が提供する Bazel 統合コードをインクルードします。それには、プロジェクトの BUILD ファイルに次の記述を追加します。

    load("@cpptest//:integration/bazel/cpptest.bzl", "cpptest_generate_bdf")
  2. BDF を構成するターゲットのリストを作成します。

    targets = [ "hello-world" ]
  3. ターゲットの後に次のルール宣言を追加し、BDF 生成ルールにターゲットを登録します。

    cpptest_generate_bdf(
        name = "make_bdf",
        deps = targets,
    )

    これで、cpptest_generate_bdf ルールが BUILD ファイルに登録されました。

  4. BUILD ファイルを保存します。

BDF ファイルの生成

  1. BDF 生成ルールを実行するには、次のようなコマンドを入力します (この例では、gcc_10-64 コンパイラと上記の "hello-world" プロジェクトを使用しています)

    bazel run //:make_bdf --@cpptest//:compiler-config=gcc_10-64 --@cpptest//:project-name=hello-world

    使用しているコンパイラとプロジェクトに合わせて compiler-config および project-name 引数をカスタマイズします。
    プロジェクトのルートに BDF が生成されます。統合によって、C/C++test Professional がプロジェクトを C/C++test プロジェクトとして開くのに必要なファイルも生成されます。

  2. プロジェクトを Eclipse ワークスペースにインポートして解析を実行します。

    cpptestcli -data /path/to/workspace -import . -config "builtin://Recommended Rules"
  • BDF を生成しても、実行ファイル、オブジェクト、生成済みソースなどのプロジェクト成果物は作成されません。
  • プロジェクトに対して自動生成されたコードは、bazel-build サブディレクトリに配置されます。
  • bazel clean を実行すると、このディレクトリの内容が削除され、BDF が無効になります。
  • ターゲットを再ビルドすると、BDF 内の不足している参照が解決されます。

コード カバレッジ ルールの登録

プロジェクトの BUILD ファイルでターゲット実行ファイルにコード カバレッジを追加するには、ファイルに新規ルールを追加する必要があります。 

  1. BUILD ファイルの次の行を変更します。

    load("@cpptest//:integration/bazel/cpptest.bzl", "cpptest_generate_bdf")

    次のように変更します。

    load("@cpptest//:integration/bazel/cpptest.bzl", 
        "cpptest_generate_bdf",
        "cpptest_code_coverage_executable"
    )
  2. ファイルに新規ルールを追加します。

    cpptest_code_coverage_executable(
        name = "code_cov", # This can be any name
        deps = targets, # Reuse the list of targets from BDF generation 
    )

コード カバレッジが有効な実行ファイルの生成

次の手順に従って、インストゥルメントされたバイナリを生成します。 

  1. 行カバレッジを指定します。それには、Bazel の run コマンドに新しいオプションを追加します。オプションの指定によって、行カバレッジを有効にして実行ファイルをインストゥルメントするよう cpptestcc に指示します。

    bazel run //:code_cov --@cpptest//:compiler-config=gcc_10-64 --@cpptest//:line-coverage
    • 生成される実行ファイルは "<TARGET_NAME>.elf" という形式であり、通常のバイナリが生成されるのと同じレベルにある bazel-bin ディレクトリに配置されます。上の例では、"hello-world.elf" が生成されます。(注意: ファイル拡張子 ".elf" の使用は任意です)
    • Bazel との統合はインストゥルメントされたバイナリを実行しません。
  2. インストゥルメントされたバイナリを実行します。

    ./bazel-bin/hello-world.elf
  3. プロジェクトを Eclipse ワークスペースにインポートしてカバレッジ レポートを生成します。

    cpptestcli -data /path/to/workspace -import . -config "builtin://Load Application Coverage" -report reports

C/C++test の設定オプション

オプション説明
--@cpptest//:compiler-config=<COMPILER-CONFIGURATION-NAME>C/C++test の Bazel 統合を構成するルールにコンパイラ コンフィギュレーション名を渡します。このオプションをコマンド ラインで常に指定することを推奨します。デフォルトでは、コンパイラ コンフィギュレーションには、説明のための無効な値が設定されています。 
--@cpptest//:project-name=<NEW-PROJECT-NAME>

生成される BDF ファイルの名前を指定します。WORKSPACE ファイルに明示的に名前が指定されている場合、常にその名前が使用されます。このオプションがコマンド ラインで明示的に指定されていない (そして WORKSPACE で明示的に名前が指定されていない) 場合、ワークスペースのルートを含むフォルダー名が使用されます。

たとえば、ワークスペースのルートへのパスが /foo の場合、プロジェクト名は foo になります。

--@cpptest//:line-coverage

行カバレッジを有効にします。

--@cpptest//:mcdc-coverage

MC/DC カバレッジを有効にします。

--@cpptest//:optimized-line-coverage

最適化された行カバレッジを有効にします。

--@cpptest//:function-coverage

関数カバレッジを有効にします。

--@cpptest//:optimized-function-coverage

最適化された関数カバレッジを有効にします。

--@cpptest//:statement-coverage

ステートメントカバレッジを有効にします。

--@cpptest//:optimized-statement-coverage

最適化されたステートメント カバレッジを有効にします。

--@cpptest//:block-coverage

ブロックカバレッジを有効にします。

--@cpptest//:optimized-block-coverage

最適化されたブロック カバレッジを有効にします。

--@cpptest//:simple-condition-coverage

単純条件カバレッジを有効にします。

--@cpptest//:optimized-simple-condition-coverage

最適化された単純条件カバレッジを有効にします。

--@cpptest//:path-coverage

パスカバレッジを有効にします。

--@cpptest//:decision-coverage

decision (判断文)カバレッジを有効にします。

--@cpptest//:optimized-decision-coverage

最適化された decision (判断文) カバレッジを有効にします。

--@cpptest//:call-coverage

コール カバレッジを有効にします。

--@cpptest//:optimized-call-coverage

最適化されたコール カバレッジを有効にします。

--@cpptest//:template-coverage

テンプレート カバレッジを有効にします。

  • No labels