Go 1.22 にアップデートしたらテストカバレッジがガクッと下がってびっくりした話
2024-02-13先日リリースされた Go 1.22 の変更点の中に、 go test -cover
の挙動についても変更がありました。Go 1.22 にアップグレードしたところそれ以前と比較してテストカバレッジが低くなってしまったことで気付いたので、備忘録として残しておきます。
Go 1.22 における go test -cover
の挙動の変更点
リリースノートにおける該当箇所は下記です。 (冒頭なので読んでないほうがおかしい 🪃)
go test -cover now prints coverage summaries for covered packages that do not have their own test files. Prior to Go 1.22 a go test -cover run for such a package would report
? mymod/mypack [no test files]
and now with Go 1.22, functions in the package are treated as uncovered:
mymod/mypack coverage: 0.0% of statements
Go 1.22 Release Notes - The Go Programming Language
これにより、テストファイルが存在しないパッケージに対して go test -cover
を実行した場合、それまではカバレッジが出力されていなかったのが、 Go 1.22 ではカバレッジが 0% として表示されるようになりました。
go test -cover 実行時の差分
では、実際に出力がどのように変わったのか、 1.21 と 1.22 で比較してみます。
対象は、 esa の API クライアントライブラリである michimani/go-esa です。 (これの Go version を 1.22 にしようとして気付いたのでした)
Go 1.21
❯ go test ./... -cover
? github.com/michimani/go-esa [no test files]
? github.com/michimani/go-esa/esaapi/category [no test files]
? github.com/michimani/go-esa/esaapi/comment [no test files]
? github.com/michimani/go-esa/esaapi/emoji [no test files]
? github.com/michimani/go-esa/esaapi/invitation [no test files]
? github.com/michimani/go-esa/esaapi/member [no test files]
? github.com/michimani/go-esa/esaapi/models [no test files]
? github.com/michimani/go-esa/esaapi/oauthtoken [no test files]
? github.com/michimani/go-esa/esaapi/post [no test files]
? github.com/michimani/go-esa/esaapi/star [no test files]
? github.com/michimani/go-esa/esaapi/stats [no test files]
? github.com/michimani/go-esa/esaapi/tag [no test files]
? github.com/michimani/go-esa/esaapi/team [no test files]
? github.com/michimani/go-esa/esaapi/user [no test files]
ok github.com/michimani/go-esa/esaapi/category/types 0.195s coverage: 91.7% of statements
? github.com/michimani/go-esa/esaapi/watch [no test files]
ok github.com/michimani/go-esa/esaapi/comment/types 0.374s coverage: 97.7% of statements
ok github.com/michimani/go-esa/esaapi/emoji/types 0.552s coverage: 96.9% of statements
ok github.com/michimani/go-esa/esaapi/invitation/types 0.738s coverage: 98.4% of statements
ok github.com/michimani/go-esa/esaapi/member/types 0.908s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/oauthtoken/types 1.087s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/post/types 1.247s coverage: 97.5% of statements
ok github.com/michimani/go-esa/esaapi/star/types 1.404s coverage: 97.7% of statements
ok github.com/michimani/go-esa/esaapi/stats/types 1.587s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/tag/types 1.764s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/team/types 1.931s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/user/types 2.086s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/watch/types 2.168s coverage: 100.0% of statements
ok github.com/michimani/go-esa/gesa 2.101s coverage: 98.4% of statements
ok github.com/michimani/go-esa/internal 2.270s coverage: 100.0% of statements
Go 1.22
❯ go1.22.0 test ./... -cover
? github.com/michimani/go-esa [no test files]
github.com/michimani/go-esa/esaapi/category coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/comment coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/emoji coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/invitation coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/member coverage: 0.0% of statements
? github.com/michimani/go-esa/esaapi/models [no test files]
github.com/michimani/go-esa/esaapi/post coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/oauthtoken coverage: 0.0% of statements
ok github.com/michimani/go-esa/esaapi/category/types 0.187s coverage: 91.7% of statements
github.com/michimani/go-esa/esaapi/star coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/stats coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/tag coverage: 0.0% of statements
ok github.com/michimani/go-esa/esaapi/comment/types 0.308s coverage: 97.7% of statements
github.com/michimani/go-esa/esaapi/team coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/user coverage: 0.0% of statements
github.com/michimani/go-esa/esaapi/watch coverage: 0.0% of statements
ok github.com/michimani/go-esa/esaapi/emoji/types 0.484s coverage: 96.9% of statements
ok github.com/michimani/go-esa/esaapi/invitation/types 0.659s coverage: 98.4% of statements
ok github.com/michimani/go-esa/esaapi/member/types 0.963s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/oauthtoken/types 0.769s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/post/types 1.009s coverage: 97.5% of statements
ok github.com/michimani/go-esa/esaapi/star/types 1.132s coverage: 97.7% of statements
ok github.com/michimani/go-esa/esaapi/stats/types 1.316s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/tag/types 1.447s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/team/types 1.503s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/user/types 1.664s coverage: 100.0% of statements
ok github.com/michimani/go-esa/esaapi/watch/types 1.701s coverage: 100.0% of statements
ok github.com/michimani/go-esa/gesa 1.829s coverage: 98.4% of statements
ok github.com/michimani/go-esa/internal 1.993s coverage: 100.0% of statements
例えば github.com/michimani/go-esa/esaapi/category
パッケージについては、 1.21 では [no test files]
と表示されていたのが、 1.22 では coverage: 0.0% of statements
と表示されるようになりました。
これは、 github.com/michimani/go-esa/esaapi/category
パッケージ配下にはテスト可能な実装があるにも関わらずテストファイルが存在していないのが原因です。
一方で、 github.com/michimani/go-esa/esaapi/models
パッケージについてはどちらも [no test files]
と表示されています。これは、パッケージは以下にテスト可能な実装がないためです。実際、 models
パッケージには構造体の定義のみが存在しています。
この変更による影響
この変更により、 1.22 未満のバージョンと比較してテストカバレッジが低くなることが予想されます。
例にあげた go-esa
ではテストカバレッジの可視化に CodeCov を利用しているのですが、 1.21 のときと比較してカバレッジが 97.26 % から 83.21 % に下がりました。(-14.05 %)
表示としても、 github.com/michimani/go-esa/esaapi/category
パッケージについてはカバレッジの表示がなかったのが、 0 % として表示されるようになりました。
Go 1.21
Go 1.22
さいごに
急にテストカバレッジがガクッと下がってしまってびっくりした話でした。
comments powered by Disqus