go test -coverpkg={テスト対象パッケージ} [-coverprofile=coverage.out とか] ./...
Go ではテストのカバレッジ率を go test -cover
で取ることができます。
が、パッケージの分け方によっては、ちょっとオプションを追加しないと想定したカバレッジが取れない(無視される)場合があります。
テスト対象のディレクトリ構成
次のようにディレクトリを作っているものとします。
ちなみに、テスト対象のパッケージ名は「gli」で、ライブラリです。
> tree /F /A
.
| テスト対象.go (package gli)
| ちょっとした_test.go (package gli)
|
\---test
色々な_test.go (package test)
実際にはそれぞれ複数の .go ファイルがあるのですが、ここでは簡略化しています。
見ての通り、テストが複数のディレクトリ複数のパッケージにまたがっています。
(テストファイルが多いと見辛いので、ディレクトリを分けたかったんです)
サブパッケージを含めたテストは、go test ./...
カバレッジとは関係なしに、テストだけをしたい場合であっても、go test
とすると、
ルートにある「ちょっとした_test.go」か、test ディレクトリにある「色々な_test.go」のいずれかのテストしか実行されません。
これは、go test
のデフォルトのテスト対象がカレントディレクトリだからです。
「色々な_test.go」もテスト対象とするためには、ルートで go test ./...
とします。
単純に go test -cover ./... するとダメ
上のノリで、カバレッジ率を取る場合に go test -cover ./...
としてもうまくいきません。
>go test -cover ./...
ok bitbucket.org/shu/gli (cached) coverage: 42.6% of statements
ok bitbucket.org/shu/gli/test (cached) coverage: 0.0% of statements
3行目、test パッケージのテストカバレッジが 0.0% になっています。
一方で、実はちゃんと test パッケージのテストは実行されています。
(-v
オプションを追加することで分かります。ここでは載せませんが)
-coverpkg オプションが必要
原因については推測なんですが、(デフォルトでは)カバレッジの取得対象がテストパッケージそのものになっているからと思われます。
というのも、今回のテスト対象パッケージである gli (ルート . にあるパッケージ)に含まれているテストについてのみカバレッジが取得できていますし。
で、-coverpkg
オプションとして テスト対象パッケージを指定することで、複数のテストパッケージでの結果を取得することができるようです。
実行して結果を見てみましょう。
>go test -coverpkg=. ./...
ok bitbucket.org/shu/gli 0.100s coverage: 42.6% of statements in .
ok bitbucket.org/shu/gli/test 0.107s coverage: 72.4% of statements in .
カバレッジ率がでましたね。
良かった良かった。
。o○(この2つのカバレッジの和集合ってどう取るんだろう?? テストだけ複数パッケージに分けるのはダメか…?)
。o○(gli に対するテストは、今回の例で言うところの test パッケージだけにしておけば良かったかも)