Posted at

Goで自動生成ファイルをtest coverageの計測対象から除外する方法


概要

gRPCなどを使用していると、Goの自動生成ファイルを使用することになると思います。

その際、go test コマンドは、.goという拡張子のすべてのファイルをtest coverageの計測対象とするため、CIなどでtest coverageを計測している場合、この自動生成ファイルまでtest coverageの分母に入ってしまい、意味のある数字が得られなくなると思います。

そこで、それに対処する方法を解説します。


やり方

前提として、go test コマンド自体に、特定のファイルを除外するようなオプションはありません。

なので、go testの生成ファイルから、除外したいファイルに関する記述をgrepして除外していくことになります。

$ go test . -coverprofile cover.out.tmp                  

# "_generated.go"の部分は、自動生成ファイルのファイル名の形式に合わせて変更する
$ cat cover.out.tmp | grep -v "_generated.go" > cover.out
$ rm -f cover.out.tmp
$ go tool cover -func cover.out


コピペ用

理解しやすい用に上記で一行ずつのコマンドを記載しましたが、実際はまとめて実行する場合が多いと思うので、コピペして実行する際は下記がおすすめです。

$ TEMP_COVER_OUT=$(mktemp); go test ./... -coverprofile $TEMP_COVER_OUT; cat $TEMP_COVER_OUT | grep -v "pb.go" > cover.out; rm $TEMP_COVER_OUT

$ go tool cover -html=cover.out


参考

How to ignore Generated files from Go test coverage