michimani.net

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.21 でのカバレッジ

Go 1.22

Go 1.22 でのカバレッジ

さいごに

急にテストカバレッジがガクッと下がってしまってびっくりした話でした。


comments powered by Disqus