はじめに
Goは標準の機能としてテストカバレッジをだすことができます。
単純にテストのカバー率を算出するものから具体的にどこの部分のテストが足りないかを示してくれる機能もあるので今回はそれらを簡単にまとめたいと思います。
シンプルにテストカバレッジを測定する
$ go test -cover ./...
? app_name/api [no test files]
? app_name/api/config [no test files]
ok app_name/api/handlers 0.421s coverage: 100.0% of statements
? app_name/api/responses [no test files]
シンプルにテストカバレッジを測定するときはgo test -cover
とすることでこのようにテストカバー率を出してくれます
具体的にどこがテストできてないかを表示する
# cover.outというファイルテストのカバー内容を吐き出す
$ go test -cover ./... -coverprofile=cover.out
# go toolを用いてcover.htmlを作成する
$ go tool cover -html=cover.out -o cover.html
# cover.htmlを開く
$ open cover.html
具体的にテストされていない場所を特定するときは上記のようにコマンドを打つことでテストできていないところを赤文字で表示させることができます。
不要なファイルをカバレッジ計算から排除する
# cover.out.tmpというファイルテストのカバー内容を吐き出す
go test -cover ./... -coverprofile=cover.out.tmp
# 自動生成コードをカバレッジ対象から外し、カバレッジファイルを作成
cat cover.out.tmp | grep -v "**_mock.go" > cover.out
# 不必要なcover.out.tmpを削除
rm cover.out.tmp
# 以下先ほどと同じ
go tool cover -html=cover.out -o cover.html
open cover.html
テストカバー率を測定するときにmock用のコードなどが入ってしまうと適切なカバレッジを測定できないので、そのようなときは少しシェル芸します
上記の場合はコードをmockするときに_mock.go
という接尾語をつけているのでその場合はカバレッジ測定のファイル(cover.out)から削除します。
最後に
goは標準でテストカバレッジツールがついているのはとてもいいですね!
真っ赤な状態からテストを書いてどんどん緑にしていく過程は結構楽しいです!!
以下個人的に使ってるmake fileコマンドです
独自のmockファイルとwireの自動生成ファイルを外すようにしています
Makefile
cover:
go test -cover ./... -coverprofile=cover.out.tmp
# 自動生成コードをカバレッジ対象から外し、カバレッジファイルを作成
cat cover.out.tmp | grep -v "**_mock.go" | grep -v "wire_gen.go" > cover.out
rm cover.out.tmp
go tool cover -html=cover.out -o cover.html
open cover.html
参考文献
- 公式ドキュメント(https://blog.golang.org/cover)
- Go でコードカバレッジを取得する(https://qiita.com/kkohtaka/items/965fe08821cda8c9da8a)