| name | write-tests |
| description | このプロジェクトでテストコードを作成する際に使用する。テーブル駆動テスト、モック作成、検証観点のパターンに従う。 |
テストの作成
このプロジェクトのテストはtestifyなどの外部テストフレームワークを使わず、標準のtestingパッケージをベースに書く。
テストファイルの配置
テスト対象と同じパッケージ内に配置する。ファイル名は{対象ファイル名}_test.goとする。
テスト関数の命名
- 関数テスト: Test{関数名}
- メソッドテスト: Test{型名}_{メソッド名}
- 条件付き: Test{型名}{メソッド名}{条件}
テーブル駆動テスト
このプロジェクトではテーブル駆動テストを標準パターンとして使用する。テストケースにはnameフィールドで説明を記載し、t.Runでサブテストとして実行する。
モックの作成
domain/repositoryのインターフェースに対し、テストファイル内にモック構造体を定義する。モック構造体のフィールドで戻り値やエラーを制御する。呼び出し回数を検証したい場合はcalledフィールドを追加する。
HTTPサーバのモック
外部APIとの通信テストにはnet/http/httptestパッケージを使用する。テスト終了時にdefer server.Close()で確実にクリーンアップする。
テストで検証すべき観点
- 正常系: 期待する出力が得られること
- エラー系: 適切なエラーが返ること
- 境界値: 空スライス、nil、ゼロ値の扱い
- context取消: context.WithCancelで中断時の挙動
- 並行アクセス: sync.WaitGroupで複数ゴルーチンからの同時アクセス
- 冪等性: 同じ操作を2回実行しても問題ないこと
CIとの整合
テストはgo test -race ./...で実行される。データ競合が検出されないよう、共有状態へのアクセスにはsync.Mutexなどで保護する。