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するようになるため諦めるべき。