post Image
Web Application周りのテスト方法

色々な方法があると思うけど、簡単な3種類をまとめておく。

テスト対象のコード

package main

import (
    "net/http"

    "github.com/facebookgo/grace/gracehttp"
    "github.com/sebest/xff"
    "goji.io"
    "goji.io/pat"
    "golang.org/x/net/context"
)

func main() {

    mux := goji.NewMux()

    mux.HandleC(pat.New("/*"), NewMux())

    err := gracehttp.Serve(&http.Server{Addr: ":8080", Handler: mux})
    if err != nil {
        panic(err)
    }
}

func NewMux() *goji.Mux {

    mux := goji.NewMux()

    mux.Use(xff.Handler)
    mux.HandleFuncC(pat.Get("/:name"), Hello)

    return mux
}

func Hello(ctx context.Context, w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("Hello, " + pat.Param(ctx, "name") + "\nRemote Address: " + r.RemoteAddr))
}

テストコード

その1: 関数に対してテスト

普通に関数に対してテストを行う。
特に難しいことは、していない。

func TestHello(t *testing.T) {

    t.Parallel()

    ctx := context.WithValue(context.Background(), pattern.Variable("name"), "john")

    req, err := http.NewRequest("", "", nil)
    require.NoError(t, err)

    resp := httptest.NewRecorder()
    Hello(ctx, resp, req)

    require.Equal(t, http.StatusOK, resp.Code)
    require.Contains(t, resp.Body.String(), "Hello, john")
    require.NotContains(t, resp.Body.String(), "127.0.0.1")
}

その2: Multiplexer に対してテスト

Routing とか、 Middleware とかテストしたい時は、こっちの方が適切だと思う。

func TestUsersMultiplexer(t *testing.T) {

    t.Parallel()

    mux := NewMux()

    req, err := http.NewRequest("GET", "/john", nil)
    require.NoError(t, err)

    resp := httptest.NewRecorder()
    mux.ServeHTTP(resp, req)

    require.Equal(t, http.StatusOK, resp.Code)
    require.Contains(t, resp.Body.String(), "Hello, john")
    require.NotContains(t, resp.Body.String(), "127.0.0.1")
}

その3: Server を立ち上げてのテスト

E2E 的なテストをしたい時や、 RemoteAddr を用いている場合は、こちらの方法が良い。

func TestServer(t *testing.T) {

    t.Parallel()

    ts := httptest.NewServer(NewMux())
    defer ts.Close()

    resp, err := http.Get(ts.URL + "/john")
    require.NoError(t, err)

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    require.NoError(t, err)

    bodyStr := string(body)

    require.Equal(t, http.StatusOK, resp.StatusCode)
    require.Contains(t, bodyStr, "Hello, john")
    require.Contains(t, bodyStr, "127.0.0.1")
}

他にも良い方法あったら、コメント下さい。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。