関わっているプロダクトでテストのカバレッジ取得してみようと思ったので、標準で動作している機能を使ってgoのテストカバレッジを計測してみました。
coverageを計測する
coverageを測定するpackageを指定して、カバレッジを図るオプション -cover
を指定します。
$ gotest -cover ./path/to/package_name ## test 実行中 coverage: 45.9% of statements
coverageのパーセンテージが出力されます。
goではpackage単位でカバレッジが計測されます。
テストされている箇所とされてない箇所を視認する
htmlを生成してブラウザで開く
以下の記事を参考にcover.htmlを生成してブラウザで表示させてみました。
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
でノイズは取り払ってもおくといいかと思います。