emahiro/b.log

Drastically Repeat Yourself !!!!

goのテストのカバレッジを計測する

関わっているプロダクトでテストのカバレッジ取得してみようと思ったので、標準で動作している機能を使ってgoのテストカバレッジを計測してみました。

coverageを計測する

coverageを測定するpackageを指定して、カバレッジを図るオプション -cover を指定します。

$ gotest -cover ./path/to/package_name

## test 実行中

coverage: 45.9% of statements

coverageのパーセンテージが出力されます。
goではpackage単位でカバレッジが計測されます。

テストされている箇所とされてない箇所を視認する

htmlを生成してブラウザで開く

以下の記事を参考にcover.htmlを生成してブラウザで表示させてみました。

qiita.com

GPPATH配下にプロジェクトがある場合は任意のディレクトリにて以下を叩きます。

$ go test -coverprofile=cover.out ./path/to/package
ok      ./path/to/package 0.12s  
coverage: 75.0% of statements
$ go tool cover -html=cover.out -o cover.html
$ open cover.html

ブラウザにテストされている箇所とされていない箇所が表示されます。
されている箇所は緑色で、されてない箇所は赤でコードがハイライトされているので、条件分岐箇所などをみながらどこがテストされていて、どこがテストされていないのかを確認することが可能です。

こういうツールが標準でついてるんだから本当に便利だなと思います。

テスト戦略にも関わってくるので、例えばキャッシュの有無など、動作に影響ないところのコード等はある程度テストを書かずともいいですが、ビジネスロジックに関わるところはちゃんとテストされているかを確認してみてください。

ハマったところ

direnvでプロジェクトごとにGOPATHを指定している場合に少しハマりました。 カバレッジを計測したhtmlファイルをプロジェクトとは別ディレクトリでgo tool cover -htmlをしようとしてもGOPATHが違うと言われて動作しなかったので、direnvを使っている場合は、direnvで指定したGOPATH配下に出力ファイルを作ると正常にhtmlに変換されます。

// デフォルトのGOPATHに移動
$ cd $GOPATH
$ ~/go go tool cover -html=cover.out -o cover.html
cover: can't find "application.go": cannot find package "GAE_PROJECT_GOPATH/model" in any of:
  /usr/local/Cellar/go/1.9.2/libexec/path/to/model (from $GOROOT)
  path/to/model (from $GOPATH)

ただ、gitでトラッキングする際にノイズになるので、 .gitignore~/.gitignore_global でノイズは取り払ってもおくといいかと思います。