Goでテストカバレッジを測定する


はじめに

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

参考文献