mcpField
W
writing-go-tests

writing-go-tests

github.com/sammcjテスト・品質16779 回インストール2 日前に更新
リポジトリ

writing-go-tests について

Go のテスト実践をまとめたスキルで、テストの構成、アサーション、並行処理、フィクスチャ、ベンチマークを扱います。保守しやすいテストを書く Go 開発者向けで、詳細な例と根拠は別のガイドにあります。

主な機能

  1. 01テストファイルの構成と命名
  2. 02テーブル駆動テストの指針
  3. 03決定的な並行テスト
  4. 04アサーション、モック、統合テスト
  5. 05カバレッジ、フィクスチャ、後処理
  6. 06Go 1.24 以降のベンチマーク指針

活用シーン

  1. 01ユニットテストと統合テストの構成
  2. 02Go の並行コードのテスト
  3. 03アサーションとテストダブルの選択
  4. 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 では、適用すべき実践的なルールを紹介します。

重要な原則

実装ではなく動作を検証する、価値のあるテストに重点を置きます。 理論上の完璧さより、実践的な優れた成果を重視します。

コメント