はじめに
GinフレームワークでAPIを構築した際、正しく動作しているかを確認するためにテストを書くことは非常に重要です。本記事では、標準パッケージのhttptest
を使ってAPIコントローラーのテストを書く方法を詳しく解説します。
サンプルコード概要
今回は以下のようなシンプルなHealth
エンドポイントをテストします。このエンドポイントは、アプリケーションのヘルスチェックを行い、ステータスをJSONで返すものです。
package controllers
import (
"net/http"
"github.com/gin-gonic/gin"
)
// Health エンドポイント: アプリケーションのヘルスチェック
func Health(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
})
}
このコードに対して、httptest
を利用したテストを実装します。
テストコードの実装
以下がhttptest
を利用したテストコードです。一行ずつ解説していきます。
package controllers
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
)
// TestHealthHandlerはHealthエンドポイントのテスト
func TestHealthHandler(t *testing.T) {
// HTTPレスポンスを記録するRecorderを作成
w := httptest.NewRecorder()
// テスト用のHTTPリクエストを作成。GETメソッドで/healthエンドポイントを指定
request, _ := http.NewRequest("GET", "/health", nil)
// Ginのテスト用コンテキストを作成
ginContext, _ := gin.CreateTestContext(w)
// Ginのテスト用コンテキストにリクエストを設定
ginContext.Request = request
// テスト対象のHealthハンドラーを呼び出し
Health(ginContext)
// Recorderに記録されたレスポンスコードが200(OK)であることをアサート
assert.Equal(t, 200, w.Code)
// Recorderに記録されたレスポンスボディが期待するJSON文字列と一致することをアサート
assert.JSONEq(t, `{"status":"ok"}`, w.Body.String())
}
詳細な解説
1. Recorder作成
HTTPレスポンスを記録するhttptest.ResponseRecorder
を作成します。Recorderを通じて、ハンドラーが返すレスポンスの中身を後で検証します。
w := httptest.NewRecorder()
2. テスト用のHTTPリクエストを作成
テスト用のHTTPリクエストを作成します。ここではGET
メソッドで/health
エンドポイントを指定しています。
request, _ := http.NewRequest("GET", "/health", nil)
3. Ginのテスト用コンテキストを作成
GinのCreateTestContext
を使ってテスト用のコンテキストを作成します。これをハンドラー関数に渡します。
ginContext, _ := gin.CreateTestContext(w)
4. リクエストをコンテキストに設定
作成したHTTPリクエストをGinのテスト用コンテキストにセットします。これでハンドラー内でリクエスト内容を利用できるようになります。
ginContext.Request = request
5. ハンドラーを実行
テスト対象のHealth
ハンドラーを実行します。レスポンス内容はRecorderに記録されます。
Health(ginContext)
6. レスポンスコードを検証
Recorderに記録されたレスポンスコードが期待するHTTPステータスコード(200)であることを検証します。
assert.Equal(t, 200, w.Code)
7. レスポンスボディを検証
Recorderに記録されたレスポンスボディが期待するJSON文字列{"status":"ok"}
と一致することを検証します。assert.JSONEq
を使うと、JSONのキー順序に関係なく比較できます。
assert.JSONEq(t, `{"status":"ok"}`, w.Body.String())
まとめ
今回の記事では、httptest
を使ったAPIコントローラーのテスト方法を解説しました。この方法を使えば、Ginフレームワークで構築したAPIの挙動を簡単に検証できます。テストコードはプロジェクトの品質向上に欠かせません。ぜひ、自分のプロジェクトにも取り入れてみてください!