LoginSignup
2
0

More than 5 years have passed since last update.

テストパッケージを分けている場合のカバレッジ取得方法

Last updated at Posted at 2018-03-03
この投稿での最終形
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% になっています。:fearful:

一方で、実はちゃんと 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 .

カバレッジ率がでましたね。:smile:
良かった良かった。:smile:


:sweat_smile:。o○(この2つのカバレッジの和集合ってどう取るんだろう?? テストだけ複数パッケージに分けるのはダメか…?)
:sweat_smile:。o○(gli に対するテストは、今回の例で言うところの test パッケージだけにしておけば良かったかも)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0