feature image

2025年4月23日 | ブログ記事

t.Cleanup(func () { t.Context() })

このブログは 2025 年新歓ブログリレー 47 日目 (4/22) の記事です。

22B のいくら・はむです。traPでは主にGo言語でサーバーアプリケーションを書いています。この記事では、Go 1.24 で追加された (*testing.common).Context に関する静的解析ツールを作ったことについて書こうと思います。

(*testing.common).Context とは

2025 年 2 月にリリースされた Go 1.24 で追加された機能の一つに、 (*testing.common).Context メソッドがあります。このメソッドは、context.Contextを返す関数です。testing.commonというのは testing パッケージで定義されている構造体で、testing.Ttesting.Bに埋め込まれています。そのため、この新しいメソッドはレシーバに*testing.T*testing.Bの 2 種類を取ることができます。このメソッドが返す context.Context はテストが完了して Cleanup 関数が実行される前にキャンセルされます。

リリースノート https://tip.golang.org/doc/go1.24#testingpkgtesting

Go 1.24 Release Notes - The Go Programming Language

このメソッドは非常に便利で、テスト関数の中でのみ有効な context.Context を何も考えずに使うことができます。今までは自分でキャンセル処理を書く必要があったので、大きな変化になります。
しかし、先ほど述べたように、このcontext.Context(*testing.common).Cleanupが呼ばれるにキャンセルされてしまいます。つまり、Cleanup 関数の中でこのcontext.Contextを使うと想定通り動かない可能性があります。この仕様を知らないとなかなか罠にはまりやすそうです。

静的解析ツール c3

そこで、c3 という静的解析ツールを開発しました。Context Cleanup Checker の頭文字から c3 です。

https://github.com/ikura-hamu/c3

このツールでは、(*testing.common).Cleanupの中で (*testing.common).Context が使われていた場合、警告が表示されます。

このツールをつくるにあたっては、skeleton というツールを使って雛形のコードを生成してから書きました。必要な要素があらかじめそろった状態で書き始められるのでとても楽でした。

https://github.com/gostaticanalysis/skeleton

また、この c3 は golangci-lint の Module Plugin System に対応しています。適切な設定を記述してカスタムバイナリをビルドすれば、golangci-lintに組み込んで使うことができます。

https://golangci-lint.run/plugins/module-plugins/

----------2025-04-23-000407
カスタムしたgolangci-lintが動いている様子

Modulu Plugin System については、以前僕が書いた記事も参考にしてください。

https://trap.jp/post/2429/

おなかが空いたら golangci-lint の Module Plugin 使おう
この記事は、traPアドベントカレンダー2024 15日目の記事です。 こんにちは。ikura-hamu です。Go で Web アプリのサーバーを書いたりしています。先日(2024/12/8)に行われた ISUCON14 に出ていました(チームの参加ブログはこちら ISUCON14「リアクティブ二子玉川~♪」32位(学生5位) 参加記)。ISUCON14 に向けて作ったツールの中に、golangci-lint の Module Plugin を使ったものがあります。Module Plugin は比較的新しい機能でまだ記事が少なかったので、使い方や VSCode との統合の仕方などを書きたいと思います。 この記事でわかること * 自作の静的解析ツールを golangci-lint に組み込んで使う方法 * 自作の静的解析ツールを VSCode で実行してエディタ画面に Warning を出す方法 説明しないこと * golangci-lint とは何か * golangci-lint の

静的解析ツールを作るのは難しいですが、生成AIに相談しながら書くといい感じにできます。生成AIはコーナーケースを見つけるのは苦手なので、そこは人間がいい感じに対応しながらやるといいと思います。

静的解析ツールがあると開発の効率が大きく上がるので、これからも自分が欲しいと思ったものを積極的に作っていきたいです。c3もまだバグが残っているので、まずはそれを直したいです。
ぜひ GitHub のスターお願いします。

GitHub - ikura-hamu/c3: “Cleanup Context Checker” Go static analyzer which detects (*testing.common).Context in (*testing.common).Cleanup
“Cleanup Context Checker” Go static analyzer which detects (*testing.common).Context in (*testing.common).Cleanup - ikura-hamu/c3

明日の新歓ブログリレー担当は @Oxojo くんと @jupiter_68 くんです。

ikura-hamu icon
この記事を書いた人
ikura-hamu

SysAd班、ゲーム班 いろいろやりたい

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2025年4月6日
グラフィック班の活動紹介 2025
madara16877 icon madara16877
2024年6月21日
ハッカソン参加記 4班"Slide Center"
Alt--er icon Alt--er
2025年4月15日
新歓コンピ楽曲解説!!!
vPhos icon vPhos
2024年3月15日
個人開発として2週間でWebサービスを作ってみた話 〜「LABEL」の紹介〜
Natsuki icon Natsuki
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記