概要
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] (https://stackoverflow.com/questions/50065448/how-to-ignore-generated-files-from-go-test-coverage)