Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@takehanKosuke

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

具体的にテストされていない場所を特定するときは上記のようにコマンドを打つことでテストできていないところを赤文字で表示させることができます。
スクリーンショット 2020-09-06 22.46.09.png

不要なファイルをカバレッジ計算から排除する

# 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

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?