Slide 1

Slide 1 text

Go1.24 go vetとtestsアナライザ golang.tokyo#38 2025/03/25 kuro

Slide 2

Slide 2 text

自己紹介 kuro @knkurokuro7 - 名前:kuroda naoki - 所属:株式会社サイバーエージェント DeveloperProductivity室 Bucketeerチーム - tokyoに住んでいます。大好きな街 です。

Slide 3

Slide 3 text

目次 - go vetに入った変更について - go vetのtestsアナライザについて - testsアナライザが入った経緯について

Slide 4

Slide 4 text

go vetとは - コードの潜在的な問題を静的解析で検出するツール - コンパイラでは検出できないものを検出する。 - go tool vet helpコマンドでアナライザの一覧が表示され る。 - 各アナライザはtools/go/analysis/passesにそれぞれ独 立して実装されている。

Slide 5

Slide 5 text

go vetとは - go testコマンドを叩くとき、そのパッケージと対象となるソースファ イルに対してgo vetが実行される。 - high-confidenceなアナライザのみデフォルトで実行される。 (Go1.24時点ではatomic, bool, buildtags, directive, errorsas, ifaceassert, nilfunc, printf, stringintconv, tests) - go test側でどのアナライザをデフォルトにするか設定してある。

Slide 6

Slide 6 text

go vetに入ったアップデート 1. 新しいtestsアナライザの追加 ○ テストための関数の宣言における一般的なミスを検出 ○ go testで実行されるアナライザのサブセットに含まれる。 2. printfアナライザの拡張 ○ fmt.Printf(s) の形式の呼び出しを検出(sは非定数フォー マット文字列) ○ %記号を含む可能性のある文字列に対する危険な呼び出 しを警告

Slide 7

Slide 7 text

3. buildtagアナライザの拡張 ○ 無効なビルド制約を検出 ○ 例://go:build go1.23.1 → //go:build go1.23 4. copylockアナライザの拡張 ○ 3-clause for loopで宣言された変数にsync.Mutexのような ロックが含まれる場合を検出 ○ Go 1.22のループ変数動作変更に対応 go vetに入ったアップデート

Slide 8

Slide 8 text

testsアナライザ? - 対象とするのは、Testで始まるテスト関数、Exampleテスト関数、 Benchmark関数、Fuzzテスト関数 - 命名規則、引数(testing.Tなど)、シグニチャ等 - 例えば、以下のテスト関数は検知される。 // 小文字で始まるテスト名 func TestmyFunction(t *testing.T) { ... } // 不正なパラメータ型 func TestWrong(x int) { ... } // 型パラメータを持つテスト func TestGeneric[T any](t *testing.T) { ... }

Slide 9

Slide 9 text

リリースノートには The new tests analyzer reports common mistakes in declarations of tests, fuzzers, benchmarks, and examples in test packages, such as malformed names, incorrect signatures, or examples that document non-existent identifiers. Some of these mistakes may cause tests not to run. This analyzer is among the subset of analyzers that are run by go test. https://go.dev/doc/go1.24#vet

Slide 10

Slide 10 text

どのようにしてtestsアナライザが入ったのか - 新しく追加されたのかと思ってtools/go/analysis/passes/testsのhistory を見てみる。

Slide 11

Slide 11 text

どのようにしてtestsアナライザが入ったのか - どうやらGo1.24からgo testでデフォルトで動くvetに なったらしい。。。 - issueだと「cmd/go: add -tests to list of vet checks run by "go test" #44251」 - Goモジュールプロキシのサンプルに対して testsアナ ラザを実行したところ1056のモジュールに対して、 242件検出され、その96%「ExampleXYZは未知の識 別子XYZを参照している」ものだった。 - その検出されたものチェックした結果、偽陽性が少な いと評価されてデフォルトに追加された。                         src/cmd/go/internal/test/test.go →

Slide 12

Slide 12 text

そもそもどのような基準でデフォルトが決まったのか - Issue #18084: cmd/go: run vet automatically during 'go test' - go vetをベストプラクティスとしたい。 - なので、すでにあるもの(go test)と統合するべき(go fmtがエディターで自動実 行されるように) - vetが何かを検知するまで、ユーザーがgo testのプロセスの一部と気づかないく らい高速に動くように - Issue #18085: cmd/vet: identify 100% reliable checks for testing - 「100%信頼できる」チェックの定義 として、偽陽性(false positive)の可能性 があっても、コードを明確な方法で修正することでその問題を回避できる。

Slide 13

Slide 13 text

まとめ - go vetのtestsアナライザがgo testコマンドの実行の際にデ フォルトで動くようになった。 - testsアナライザはテストが起動しなくなってしまうような間違い を検知する。 - go testでデフォルトで動くアナライザは、偽陽性が少なく、さら にその誤検出による問題を明確に回避できるものが採用され ている。

Slide 14

Slide 14 text

参考 - Go 1.24 Release Notes - The Go Programming Language - cmd/go: run vet automatically during 'go test' · Issue #18084 · golang/go · GitHub - cmd/vet: identify 100% reliable checks for testing · Issue #18085 · golang/go · GitHub - go/analysis/passes/tests: split out from vet - cmd/go/internal/test: add 'tests' vet check to 'go test' suite - cmd/go: add -tests to list of vet checks run by "go test" #44251