理系学生日記

おまえはいつまで学生気分なのか

GolangのカバレッジをGitLabのMerge Requestに表示させたい

マネジメントを行う上では以下のような取り組みが重要です。

  • 何らかの定量指標を収集し、目標を設定する
  • その数値を誰もが見る場所に置く

これはテスト文化を作るときにも例外ではありません。 「テストを書こう」といくら啓蒙したところで、ぼくの経験上効果は薄い。 テストを根付かせるためには、誰もが見える場所にカバレッジなどの数値を示し、自分の正負両面の貢献を表すべきです。たぶん。

GitLabでカバレッジを表示する

ぼくたちはGitLabを使って開発を進めていますが、GitLabにはGitLab CI/CDの標準出力の中からカバレッジをキャプチャする機能があります。キャプチャしたカバレッジは以下のようにMerge Requestの画面に表示できます。

どのような正規表現でキャプチャするのか、という設定は、GitLabの設定->CI/CD->一般のパイプラインにあります。

Golangのカバレッジを標準出力に出力する

こちらのエントリで、マルチパッケージのGolangプロダクトにおけるカバレッジの計算方法を書きました。 一方でこのカバレッジは、全パッケージに対する「特定のパッケージにおけるテストのカバレッジ」でしかありません。今ぼくに必要なのは、全パッケージに対する「全てのテストコードのカバレッジ」です。

https://kiririmode.hatenablog.jp/entry/20210204/1612450799

こういった目的を達成するためにはgo tool coverを使います。 以下のように、最終行にtotal:としてのカバレッジが示されます。

$ go tool cover -func coverage.out | tail -5
gitlab.com/eponas/epona-aws-starter-cli/internal/version/version.go:35:                                         GetTerraformVersion                     0.0%
gitlab.com/eponas/epona-aws-starter-cli/internal/version/version.go:45:                                         SetAwsProviderVersion                   0.0%
gitlab.com/eponas/epona-aws-starter-cli/internal/version/version.go:49:                                         GetAwsProviderVersion                   0.0%
gitlab.com/eponas/epona-aws-starter-cli/main.go:5:                                                              main                                    0.0%
total:                                                                                                          (statements)                            1.2%

あとはこれを正規表現でキャプチャすれば良い。 ぼくは^total:\s+\(statements\)\s+\d+.\d+%としてキャプチャしています。

まとめ

このような設定によって、Merge Requestを作るごとに、MRの画面にカバレッジが出力されるようになります。