1
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?

なんでもアウトプットAdvent Calendar 2023

Day 12

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

Posted at

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

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

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

まず、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

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

1
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
1
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?