0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ginフレームワークで簡単にAPIテスト!httptestを使ったテスト方法を徹底解説

Posted at

はじめに

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の挙動を簡単に検証できます。テストコードはプロジェクトの品質向上に欠かせません。ぜひ、自分のプロジェクトにも取り入れてみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?