Go

Go 1.2で追加されたコードカバレッジ解析ツールを使う

More than 5 years have passed since last update.

Go 1.2にて、coverというコードカバレッジ解析を行うgo toolが追加されました。


コードカバレッジ解析とは?

プログラムの実行によって、ソースコード中のどこを(何回)通過したのかを解析します。

これにより、到達不能コード(一度も実行されないコード)や、ボトルネックになっている部分の判明が期待できます。

Go言語のコードカバレッジ解析では、まずテストコードを実行し、それによって通過した部分のソースコード全体に対する割合などを測ることができます。


簡単な使い方

まずはメインとなるコードと、テストコードをまとめたパッケージを作ります。

$ mkdir example


example/example.go

package example

func Simple(f bool) int {
if f {
return 1
} else {
return 0
}
}



example/example_test.go

package example

import "testing"

func TestSimple(test *testing.T) {
if Simple(true) != 1 {
test.Fatal("Simple(true) != 1")
}
}


go test を実行します。コードカバレッジ解析を有効にするには -cover フラグを指定して実行します。

$ go test -cover ./example

下のような結果が出力されます(※ディレクトリ名は省略)


ok example 0.002s coverage: 66.7% of statements


go test -cover によって得られる解析結果はこれだけです。


詳細な解析結果を得るには

go tool cover を使います。

これを使うにはまず、環境変数 GOPATH を設定しておく必要があります。

ここではとりあえず以下のようにして対処することにします。

$ mkdir src

$ mv example src
$ export GOPATH=$PWD

※GOPATHの詳細は、他の方々が書かれている記事を参照してください。

次に、プロファイルを作成します。

プロファイルを作成するには、 go test-coverprofile 引数を渡して実行します。

この引数の値には、プロファイルを出力するファイルのパスを指定します。

また、この引数を設定すると自動で -cover フラグが追加されます。そのため、出力は前回の go test -cover と同じものになります。

$ go test -coverprofile=cover.out example

example パッケージはGOPATHの中にあるので、前回頭に付けた ./ は省略します。

上のコマンドで作成されたプロファイル cover.out に対し go tool cover を実行することで、解析結果の詳細が出力されます。

$ go tool cover -func=cover.out


example/example.go: Simple 66.7%

total: (statements) 66.7%


-func 引数経由でプロファイルのファイルパスを渡すと、上のような関数単位の割合が出力されます。

-html 引数経由だと、

$ go tool cover -html=cover.out

cover.png

規定のウェブブラウザが開き、通過したコードをハイライトして表示してくれます。

コードにカーソルを合わせると、その部分に通過した回数がポップアップします。

しかし、デフォルトではsetモードで解析が行われるため、通過した回数を1回までしかカウントしてくれません。後述するcountモードでは、完全にカウントされるようになります。


解析のモード

モード
概要

set
デフォルト。通過回数を1回までしかカウントしない。

count
通過回数を全てカウント。

atomic
通過回数を、並列処理の中でも正確に全てカウント。

これらのモードは、go test-covermode 引数に指定します。

$ go test -coverprofile=cover.out -covermode=count example

$ go tool cover -html=cover.out

cover2.png

countモードでは、通過回数が完全にカウントされ、setモードより細かく色分けされるようになっています。

モードはもっぱら解析速度の調整のためにあるのであって、結果の表現が大きく変わるということはありません。


おわりに

この記事ではごく簡単なコードに対して解析を行いましたが、より大きなコードにはとても重要なツールであり、また更にプログラミングが楽しくなるツールでもあります。バンバン使っていきましょう。

Go言語のコードカバレッジ解析に興味を持った方は、公式ブログ記事「The cover story」を読んでみることをオススメします。

それでは、楽しいGo言語ライフを!