これ一つやるために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でのカバレッジレポートの出力も可能です。
今回は使っていませんがこんなのもあります。
カバレッジの収集にgcovを使用します。コンパイラにGCCを使用している場合のみ機能します。
これによってカバレッジ計測結果が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サーバの構築を行いたい方の助けになれば幸いです。
さいごに
今回紹介した内容は非常に基本的な部分ではありますが、同時に基本的であるが故に従来の様々なツールやコマンドと組み合わせることでかなり応用の聞く内容となっています。
さすがにそこまでは出せない部分もあるのですが、Bazelを使ってテストを行いたい方、Bazelを使ってCIサーバの構築を行いたい方の助けになれば幸いです。
0 件のコメント:
コメントを投稿