Carpe Diem

備忘録

Goでテストカバレッジ

環境

インストール

$ go get code.google.com/p/go.tools/cmd/cover

テストコードの用意

ソースコード

package foo

func Sum(a int, b int) int {
        return a + b
}

テストコード

package foo

import "testing"

func TestSum(t *testing.T) {
        expected := 3
        actual := Sum(1, 2)

        if actual != expected {
                t.Errorf("got %v\nwant %v", actual, expected)
        }
}

コンソール上で確認

$ go test -cover
PASS
coverage: 100.0% of statements
ok      _/Users/go/src/foo  0.008s

出力して確認

カバレッジの結果をファイルに出力することもできます。
これによってどのコードを通過しているか可視化できます。
注意としてはGOPATH行ってください。でないと

$ go tool cover -func=coverage.out 
cover: can't find "foo.go": cannot find package ~~~~

といった感じに怒られます。

$ go test -v -coverprofile=coverage.out

コンソールで確認

$ go tool cover -func=coverage.out
foo/foo.go:3:   Sum     100.0%
total:      (statements)    100.0%

ブラウザで確認

$ go tool cover -html=coverage.out

とするとブラウザが自動で開き以下の様な結果が表示されます。

f:id:quoll00:20141201210923p:plain

通過回数をチェック

さらに「このコードは何回通ったか」も判別できます。
covermodeオプションを付けます。

$ go test -v -coverprofile=coverage.out -covermode=count

各モードは以下のようになってます。

モード 説明
set デフォルト。通過したかしてないかのみ
count 通過回数を全てカウント
atomic 通過回数を並列処理の中でも正確に全てカウント

確認してみましょう。

$ go tool cover -html=coverage.out

f:id:quoll00:20141201211114p:plain

通過回数が多いほど色が濃くなります。
左の方にマウスを置いてちょっと待つと回数が表示されます。
こちらデフォルトだと扱いづらいのですが、Coverallsなどと組み合わせるととても見やすいです。

参考