理系学生日記

おまえはいつまで学生気分なのか

Golangで複数パッケージをまとめてカバレッジを取得する

Golangでカバレッジを取得するためには、単純にgo test -coverprofileをすれば良い。そういうふうに思っていた時期がぼくにもありました。

$ go test -coverprofile=coverage.out ./... | tail -5
?       gitlab.com/eponas/epona-aws-starter-cli/internal/logging        [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/template       [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/terraform      [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/terraform/lang [no test files]
ok      gitlab.com/eponas/epona-aws-starter-cli/internal/version        0.163s  coverage: 6.7% of statements

ここであたかもカバレッジ(6.7%)が出力されているように見えますが、実はこのカバレッジは internal/versionパッケージのものであって、プロダクトのコード全体のものではありません。

マルチパッケージの場合のカバレッジは、どのように取得すべきなのでしょうか。 この場合は-coverpkgオプションを使います。

$ go test -coverpkg=./... -coverprofile=coverage.out ./... | tail -5
?       gitlab.com/eponas/epona-aws-starter-cli/internal/logging        [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/template       [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/terraform      [no test files]
?       gitlab.com/eponas/epona-aws-starter-cli/internal/terraform/lang [no test files]
ok      gitlab.com/eponas/epona-aws-starter-cli/internal/version        0.296s  coverage: 1.2% of statements in ./...

-coverpkgオプションでは、カバレッジを分析するときの対象パッケージを指定できます。 ここで./...ワイルドカードを使用すると、全てのパッケージを対象としてカバレッジ分析を行えます。

-coverpkg pattern1,pattern2,pattern3
   Apply coverage analysis in each test to packages matching the patterns.
   The default is for each test to analyze only the package being tested.
   See 'go help packages' for a description of package patterns.
   Sets -cover.

続編。

https://kiririmode.hatenablog.jp/entry/20210206/1612561470