Bazel でカバレッジ計測を行う方法

2020/03/13

BAZEL C/C++ Googleサービス Linux RandomGrid Ubuntu 技術

t f B! P L
今回はどハマリしました。

これ一つやるために3時間も無駄にした(ー_ー;)

さて、bazelとGoogleTestでテスト環境を構築する方法は以前翻訳しましたが、テストしだすとカバレッジも計測したくなってきますよね。
特にオブジェクト指向開発を行っていると、ブラックボックス化されたクラスの中身も一通りはカバレッジ出るか見ておきたい場合があります(安心のために)
そこで今回はBazelでカバレッジ計測を行う方法を纏めました。

ちなみに今回はほぼBazelの公式ドキュメントの解説は出てきませんので、ご利用は計画的に


Bazelでカバレッジ計測を行う手順

cc_testルールの加工

C++のソースコードのカバレッジ計測には、従来カバレッジ情報を.dcnoファイルとして吐き出させる必要がありました。

g++ の実行時に --coverage オプションを指定するとこのファイルが出力されていましたが、これをBazelでも行う必要があります。

実行時に--coptオプションで設定してもいいですが、cc_testルールに書いてしまったほうが簡単でしょう。
※GCC4.x系以前の説明は省きます。

というわけで以下のようにcc_testルールを記述します。

ちなみにcoptの設定値はリンカには渡らない仕組みになっているので、copts、linkoptsの両属性に--coverageオプションが必要です。

cc_test(
    name = "hello-test",
    srcs = glob(["*.cc"]),
    copts = [
        "-Iexternal/gtest/include",
        "-coverage", 
        ],
    linkopts=[
        "--coverage",
 ],
    args = ["-gtest_output=xml"],
    deps = [
        "@gtest//:main",
        "//test:hello_test",
    ],
)

実行コマンド

実行コマンドは一気に長くなります。
bazel coverage  //testexample:hello-test --instrument_test_targets --combined_report=lcov

設定しているオプションの解説は以下。

  • --instrument_test_targets

このオプションが無効になっている場合、カバレッジ計測をいくらオプションで指定してもそれらは無視されます。カバレッジ計測系のオプションがいくつか存在するのですが、このオプションを指定しなければ他のものをいくら指定してもカバレッジ計測自体が実行されません。ハマった元凶

  • --combined_report=lcov

カバレッジ計測のレポートをlcov形式で作成するオプションです。
これによってカバレッジ計測結果がlcovを通してテスト結果格納ディレクトリに出力されます。.datファイルですが、ソースコードを集約したディレクトリに再配置すればhtmlでのカバレッジレポートの出力も可能です。

今回は使っていませんがこんなのもあります。


  • --coverage_report_generator=@bazel_tools//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:Main

カバレッジレポートの作成ツールを指定します。
現在のところbazelに同梱されているのはjavaで開発されたこのツールだけなので、実質この設定値一択になっています。
他にツールがあるか、または別の何かを指定して使えるかは要調査ですが、公式のマニュアルでもほぼ言及がありませんので難しそう、ソース開くしかないか。。。

  • --experimental_cc_coverage

カバレッジの収集にgcovを使用します。コンパイラにGCCを使用している場合のみ機能します。
ただまぁ、指定してもしなくてもとりあえずGCCを使ってるとgcovが走りますっけ。


さいごに


今回紹介した内容は非常に基本的な部分ではありますが、同時に基本的であるが故に従来の様々なツールやコマンドと組み合わせることでかなり応用の聞く内容となっています。

さすがにそこまでは出せない部分もあるのですが、Bazelを使ってテストを行いたい方、Bazelを使ってCIサーバの構築を行いたい方の助けになれば幸いです。

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ