テストの作成
このプロジェクトのテストは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などで保護する。