bazel0.24.1, bazel coverageからgo test -coverの結果を取得するワークアラウンド

環境

$ bazel version
Build label: 0.24.1
Build target: bazel-out/darwin-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue Apr 2 16:32:47 2019 (1554222767)
Build timestamp: 1554222767
Build timestamp as int: 1554222767

bazel coverage

bazelには bazel coverage コマンドが存在する。 これは対応する言語のテストとカバレッジコマンドの実行を行う。 Go言語の場合、 go test -cover を実行する 。 カバレッジを取得するためには、パッケージに go_test の宣言が存在し無くてはならない。 go_test はgazelleによって自動生成することができる。 テストファイルを書いたら gazelle update をしておくとよい。

bazelのGo言語サポートであるrules_goでは現在(2019-05-10) coverage supportについて議論中であり、bazel-out (成果物ディレクトリ) から出力結果をかき集めるワークアラウンドを行う必要がある。

coverageファイルはどこにある

bazelは成果物をworkspaceのあるディレクトリ配下にあるbazel-outディレクトリに生成する。 coverageの実行結果もそこに出力される。

つまりMac OS上で以下のコマンドを行った場合

bazel coverage //app...

取りたいカバレッジは以下のパスに置かれる。

$PWD/bazel-out/darwin-fastbuild/testlogs/app/go_default_test/coverage.dat

これで package appカバレッジを取得することができるようになる。 Goのカバレッジファイルは雑にcombinedしても問題にならないためcatで一つのファイルにまとめてしまうとカバレッジツールに流し込みやすくて良い。

--combined_report は動かない

--combined_report=lcov というオプションが存在してこれが使えそうではあるが rules_go ではNullPointerExceptionが起こった。諦めるべき。

--test_arg -test.coverprofile=/path/to/coverでcoverage.datの出力先をまとめるやつも動かない

これは optionが適切に渡されずすべてのテストがfailするようになるため諦めるべき。