go-testing
Goのテストコード全般(テーブル駆動テスト・サブテスト・並列テスト・テストヘルパー・テストダブル・`cmp.Diff`によるアサーションなど)の作成・レビュー・改善時に使用します。特定のパターンを明示しない場合でも、Go関数のテスト作成を求められた際に適用されます。なお、ベンチマークによるパフォーマンステストは対象外です(`go-performance`を参照)。
description の原文を見る
Use when writing, reviewing, or improving Go test code — including table-driven tests, subtests, parallel tests, test helpers, test doubles, and assertions with cmp.Diff. Also use when a user asks to write a test for a Go function, even if they don't mention specific patterns like table-driven tests or subtests. Does not cover benchmark performance testing (see go-performance).
SKILL.md 本文
Go テスト
クイックリファレンス
| パターン | 使用場面 |
|---|---|
t.Error | デフォルト — 失敗を報告し、実行を継続 |
t.Fatal | セットアップが失敗したか、続行が無意味な場合 |
cmp.Diff | 構造体、スライス、マップ、proto を比較 |
| テーブル駆動 | 多くのケースが同じロジックを共有 |
| サブテスト | フィルタリング、並列実行、または命名が必要 |
t.Helper() | 任意のテストヘルパー関数(最初のステートメントとして呼び出し) |
t.Cleanup() | ヘルパー内の後始末(defer の代わり) |
有用なテスト失敗メッセージ
規範: テスト失敗はテストソースを読まずに診断可能でなければならない。
すべての失敗メッセージには、関数名、入力、実際の値(got)、期待値(want)を含める必要があります。YourFunc(%v) = %v, want %v のフォーマットを使用してください。
// Good:
t.Errorf("Add(2, 3) = %d, want %d", got, 5)
// Bad: 関数名と入力が不足
t.Errorf("got %d, want %d", got, 5)
常に got を want の前に出力します。got %v, want %v — 逆にしてはいけません。
アサーションライブラリは使わない
規範: アサーションライブラリを使わない。複雑な比較には
cmp.Diffを使用する。
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("GetPost() mismatch (-want +got):\n%s", diff)
}
Protocol Buffer の場合、cmp オプションに protocmp.Transform() を追加してください。diff メッセージには常に (-want +got) の方向キーを含めてください。JSON/シリアル化出力を比較するのは避け、代わりに意味論的に比較してください。
カスタム比較ヘルパーまたはドメイン固有のテストユーティリティを書く際は、
references/TEST-HELPERS.mdを参照してください。
t.Error vs t.Fatal
規範: デフォルトとして
t.Errorを使用してすべての失敗を 1 回の実行で報告してください。続行が不可能な場合のみt.Fatalを使用してください。
t.Fatal を選択する場合:
- セットアップが失敗した(DB 接続、ファイル読み込み)
- 次のアサーションが前のアサーションの成功に依存している(例:encode の後に decode)
テストゴルーチン以外のゴルーチンから t.Fatal/t.FailNow を呼び出さないでください — 代わりに t.Error を使用してください。
t.Errorとt.Fatalのどちらかを選択する必要があるヘルパーを書く場合、または両方の詳細な例については、references/TEST-HELPERS.mdを参照してください。
テーブル駆動テスト
新しいテーブル駆動テストをスキャフォールドしており、規範的な構造体、ループ、サブテストレイアウトが必要な場合は、
assets/table-test-template.goを参照してください。
勧告: 多くのケースが同じロジックを共有する場合、テーブル駆動テストを使用してください。
テーブルテストを使用する場合: すべてのケースが条件付きセットアップ、モッキング、またはアサーションなしで同じコードパスを実行する場合。単一の shouldErr bool は受け入れられます。
テーブルテストを使わない場合: ケースが複雑なセットアップ、条件付きモッキング、または複数の分岐が必要な場合 — 代わりに別のテスト関数を書いてください。
主なルール:
- ケースが多くの行にまたがるか、同じ型の隣接したフィールドがある場合はフィールド名を使用
- 失敗メッセージに入力を含める — インデックスで行を識別してはいけません
テーブル駆動テスト、サブテスト、または並列テストを書く場合は、
references/TABLE-DRIVEN-TESTS.mdを参照してください。
検証: テストを生成または変更した後、
go test -run TestXxx -vを実行してテストがコンパイルされ、合格することを確認してください。進める前にコンパイルエラーを修正してください。
テストヘルパー
規範: テストヘルパーは最初に
t.Helper()を呼び出し、後始末にはt.Cleanup()を使用する必要があります。
func setupTestDB(t *testing.T) *sql.DB {
t.Helper()
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
t.Fatalf("Could not open database: %v", err)
}
t.Cleanup(func() { db.Close() })
return db
}
テストヘルパー、クリーンアップ関数、またはカスタム比較ユーティリティを書く場合は、
references/TEST-HELPERS.mdを参照してください。
テストエラーセマンティクス
勧告: エラーメッセージ文字列ではなく、テストエラーセマンティクスをテストしてください。
// Bad: 脆弱な文字列比較
if err.Error() != "invalid input" { ... }
// Good: 意味論的チェック
if !errors.Is(err, ErrInvalidInput) { ... }
特定のセマンティクスが重要でない単純な存在チェックの場合:
if gotErr := err != nil; gotErr != tt.wantErr {
t.Errorf("f(%v) error = %v, want error presence = %t", tt.input, err, tt.wantErr)
}
テスト構成
テストダブル、テストパッケージの配置の選択、またはテストセットアップのスコープを扱う場合は、
references/TEST-ORGANIZATION.mdを参照してください。
再利用可能なテスト検証関数を設計する場合は、
references/VALIDATION-APIS.mdを参照してください。
統合テスト
TestMain、受け入れテスト、または実際の HTTP/RPC トランスポートが必要なテストを書く場合は、
references/INTEGRATION.mdを参照してください。
利用可能なスクリプト
scripts/gen-table-test.sh— テーブル駆動テストのスキャフォールドを生成
bash scripts/gen-table-test.sh ParseConfig config > config/parse_config_test.go
bash scripts/gen-table-test.sh --parallel ParseConfig config # t.Parallel() 付き
bash scripts/gen-table-test.sh --output config/parse_config_test.go ParseConfig config
関連スキル
- エラーテスト:
errors.Is/errors.Asまたはセンチネルエラーを使用してエラーセマンティクスをテストする場合は、go-error-handlingを参照してください。 - インターフェースモッキング: コンシューマー側でインターフェースを実装してテストダブルを作成する場合は、
go-interfacesを参照してください。 - テスト関数の命名: テスト関数、サブテスト、またはテストヘルパーユーティリティに命名する場合は、
go-namingを参照してください。 - リンター統合: CI または pre-commit フックでリンターをテストと一緒に実行する場合は、
go-lintingを参照してください。
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。