以下の内容はhttps://malsan.hatenablog.com/entry/2024/09/07/224726より取得しました。


【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]

今回はそのテストの中でもサーバーを起動させてテストする方法について書きます

テスト用にプログラムを用意する

サーバーの初期化部分を切り分ける

まず、APIのコードは初期状態であれば以下のようになっていると思います。 しかしこのままではテストができないのでまずはテストを行うためにコードを切り分けます。

package main

import "github.com/labstack/echo/v4"

func main() {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        return c.String(200, "Hello, World!")
    })

    e.Logger.Fatal(e.Start(":8080"))
}

このようにサーバーを初期化する部分を外に切り分けます。 これを行うことで、テスト側でサーバーの初期化を行って起動させることができるようになります。

func InitServer() *echo.Echo {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        return c.String(200, "Hello, World!")
    })

    return e
}

func main() {
    e := InitServer()
    e.Logger.Fatal(e.Start(":8080"))
}

テストの作成

テスト側のコードは以下の通りです。順番に説明してきます。

package main

import (
    "io"
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestServerReq(t *testing.T) {
    e := httptest.NewServer(InitServer())
    r, err := http.Get(e.URL + "/")
    if err != nil {
        t.Errorf("Error making request: %s", err)
        return
    }
    defer r.Body.Close()
    if r.StatusCode != 200 {
        t.Errorf("Expected 200, got %d", r.StatusCode)
    }

    body, err := io.ReadAll(r.Body)
    if err != nil {
        t.Errorf("Error reading response body: %s", err)
        return
    }

    if string(body) != "Hello, World!" {
        t.Errorf("Expected 'Hello, World!', got '%s'", string(body))
    }
}

httptest.NewServerでサーバー起動

ではhttptest.NewServerを使うことでサーバーを起動させます。裏でstartが行われるようになっています。Goの場合、ほとんどのライブラリはnet/httpを用いて作成しているためほとんどのライブラリで同様に起動が行えます。

e := httptest.NewServer(InitServer())

リクエストを行う

以下の部分で具体的にリクエストを行っています。変数rの中に結果が格納されます。

r, err := http.Get(e.URL + "/")
if err != nil {
    t.Errorf("Error making request: %s", err)
    return
}
defer r.Body.Close()

検証

その後はテストで検証していきます。ステータスコードのテスト、bodyの内容テストなどをここで行っています。

if r.StatusCode != 200 {
    t.Errorf("Expected 200, got %d", r.StatusCode)
}

body, err := io.ReadAll(r.Body)
if err != nil {
    t.Errorf("Error reading response body: %s", err)
    return
}

if string(body) != "Hello, World!" {
    t.Errorf("Expected 'Hello, World!', got '%s'", string(body))
}

テストを実行

テストを実行すると、無事PASSしました。逆にわざとHello, World!Hello, Wに変更したりしてテストした場合はちゃんと失敗してくれたので安心です。

go test ./...

=== RUN   TestServerReq
--- PASS: TestServerReq (0.01s)
PASS
ok      test    0.333s

このようにサーバーを起動するテストはとても簡単に行なえます。これまで苦労してきた人がいたらぜひお試しください。




以上の内容はhttps://malsan.hatenablog.com/entry/2024/09/07/224726より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14