今回はそのテストの中でもサーバーを起動させてテストする方法について書きます
テスト用にプログラムを用意する
サーバーの初期化部分を切り分ける
まず、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
このようにサーバーを起動するテストはとても簡単に行なえます。これまで苦労してきた人がいたらぜひお試しください。