writing-go-tests について
Go のテスト実践をまとめたスキルで、テストの構成、アサーション、並行処理、フィクスチャ、ベンチマークを扱います。保守しやすいテストを書く Go 開発者向けで、詳細な例と根拠は別のガイドにあります。
主な機能
- 01テストファイルの構成と命名
- 02テーブル駆動テストの指針
- 03決定的な並行テスト
- 04アサーション、モック、統合テスト
- 05カバレッジ、フィクスチャ、後処理
- 06Go 1.24 以降のベンチマーク指針
活用シーン
- 01ユニットテストと統合テストの構成
- 02Go の並行コードのテスト
- 03アサーションとテストダブルの選択
- 04カバレッジとベンチマーク手法の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sammcj/ agentic-coding --skill writing-go-testsインストール後、Claude Code で/writing-go-testsを入力して読み込まれたか確認します。
同梱ファイルgo-testing-best-practices.md
詳細
Go のテストに関するベストプラクティス
このスキルでは、実践的なテストガイドラインを紹介します。詳細な実装パターン、コード例、根拠、および本番システムでの参考例については、go-testing-best-practices.md を参照してください。
Go のテストに取り組む際に
常に以下の最新のベストプラクティスを適用してください。
1. テストの構成
*_test.goという命名規則を使い、テストファイルをソースコードと同じ場所に配置します- 非公開関数の単体テストには、内部テスト(同じパッケージ)を使用します
- 統合テストやサンプルには、外部テスト(
package foo_test)を使用します - テストファイルが 500~800 行を超える場合は、機能ごとに分割します(例:
handler_auth_test.go、handler_validation_test.go)
2. テーブル駆動テスト
- テスト名が自動的に一意になるよう、スライスベースよりもマップベースのテーブルを優先します
- 失敗時の出力に表示される、説明的なテストケース名を使用します
- パターンや例の詳細については、詳細ガイドを参照してください
3. 並行テスト
- 決定論的な並行テストには
testing/synctestを使用します(Go 1.24 以降) - これにより、時間に依存する不安定なテストをなくし、実行時間を数秒から数マイクロ秒に短縮できます
- 従来の並列テストでは、テスト関数の先頭で必ず
t.Parallel()を呼び出します
4. アサーションと比較
- 複雑な比較には、
google/go-cmpのcmp.Diff()を使用します - 単純なテストには標準ライブラリで十分です
- より豊富なアサーションが必要な場合は、Testify が主要なサードパーティ製フレームワークです
5. モックとテストダブル
- 過度なモックより、実際の依存関係を使った統合テストを優先します
- データベースやサービスの統合テストには Testcontainers を使用します
- モックが必要な場合は、コード生成よりもシンプルな関数ベースのテストダブルを優先します
- インターフェースベースの設計を使用します(「インターフェースを受け取り、構造体を返す」)
6. カバレッジの目標
- 実用的な目標として、カバレッジ 70~80%を目指します
- パーセンテージの指標より、価値のあるテストを重視します
- 分析には
go test -coverとgo tool cover -htmlを使用します
7. テストフィクスチャ
- テストフィクスチャには
testdataディレクトリを使用します(Go ツールチェーンによって自動的に無視されます) - 複雑な出力の検証には、ゴールデンファイルテストを実装します
- 複雑なテストデータには、関数型ビルダーパターンを使用します
8. ヘルパーとクリーンアップ
- 正確なエラー報告のため、ヘルパー関数には必ず
t.Helper()を付けます - テストでのリソースのクリーンアップには
t.Cleanup()を使用します(テストでは defer より適しています)
9. ベンチマーク(Go 1.24 以降)
- 推奨パターンとして
B.Loop()メソッドを使用します(コンパイラーによる最適化を防ぎます) - 統計分析には
benchstatを組み合わせて使用します - メモリのプロファイリングには
-benchmemを使用します
10. 命名規則
- テスト関数:
Test*、Benchmark*、Fuzz*、Example*(プレフィックスの後は大文字) - 実際の値には
got、期待値にはwantを使用します - テーブル駆動テストでは、説明的なテストケース名を使用します
統合テストと単体テスト
- ビルドタグよりも、環境変数によるテストの分離を優先します
- 実装パターンについては、詳細ガイドを参照してください
追加の参考資料
以下が必要な場合は、go-testing-best-practices.md を読み込んでください。
- テーブル駆動テスト、モックパターン、ゴールデンファイル、ヘルパー、またはベンチマークの完全なコード例
testing/synctestを使った並行テストパターンの詳しい解説- 特定のパターンが代替案よりも推奨される理由
- 本番システムでの例や統計(Kubernetes、Docker、Uber、Netflix、ByteDance)
- テストフレームワークの選択(Testify、GoMock、Testcontainers)に関する背景情報
- 包括的なカバレッジ戦略とツールの詳細
- コンテナー化を使った統合テストのパターン
詳細ガイドには、全体的な背景、解説付きの例、および本番環境で実証されたパターンが含まれています。この SKILL.md では、適用すべき実践的なルールを紹介します。
重要な原則
実装ではなく動作を検証する、価値のあるテストに重点を置きます。 理論上の完璧さより、実践的な優れた成果を重視します。
コメント
Markdown 対応