理系学生日記

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

Golangのファイル差分におけるコードカバレッジの強調表示をGitLabで実現する

テスト文化を作るためには、自分の書いたコードのどこがテストされているのかを明示するのも意味があります。人は「ここがテストされていないよ」と言われたら、テストしたいと考えるものだからです。知らんけど。

誰もが見える場所にカバレッジなどの数値を示し、自分の正負両面の貢献を表すべきです。たぶん。

Test Coverage Visualization

テストカバレッジは、数値でも表現できますが、どこがカバーされているかという形でも表現できます。 具体的なイメージは以下です1

実現方法

上記の機能はCoberturaのレポートを使用して実現されます。 このため、GolangでもCoberturaのカバレッジレポートを生成しなければなりません。 それを実現するのがgocover-coberturaです。

gocover-coberturaを利用すると、Golangのカバレッジ情報を以下のようにしてCoberturaのレポートへ変換できます。

$ go test -coverpkg=./... -coverprofile=coverage.out ./...
$ gocover-cobertura < coverage.out > coverage.xml

あとは、このレポートを.gitlab-ci.yml上でartifacts:reports:coberturaとして指定すれば良い。 ぼくたちは、おおよそ以下のような形で実行しています。

stages:
  - test

variables:
  GOLANG_VERSION: 1.15.7

test:
  stage: test
  image: golang:${GOLANG_VERSION}
  before_script:
    - make devel-deps
  script:
    - make coverage
  artifacts:
    reports:
      cobertura: coverage.xml

これでMerge Requestのファイル差分で、どこをテストし、どこをテストしていないのかが一目瞭然になります。