読者です 読者をやめる 読者になる 読者になる

golang でテスト用のサーバを立ててクライアントのテストする

Go言語 golang

概要

golangならwebサーバにアクセスするようなクライアントがすぐかける!

・・・んだけど,テストどうしよう.というお話のメモ.

net/http/httptestというパッケージが用意されているのでこれを利用すればダミーのテストサーバを立てて,そこへのアクセスするテストがすぐかけます.簡単.

サンプル

このサンプルでは,endpoint を2つ用意します./endpoint1にはGETで,/endpoint2にはPOSTでアクセスする想定です.

ミソはts.URLでテストサーバーのベースURLが返ってくるので,これでアクセス先をうまく制御することだと思います. 必要なら自分で作ったクライアントにベースのURLをセットできる仕組みを入れておくとアクセス先を簡単にすげ替えられていいかもしれません. サンプルは普通のプログラムですが,テストに同じように作っておけばちょっとしたテストなら済ませられそうです.

import (
        "fmt"
        "net/http"
        "net/http/httptest"
        "net/url"
)

func main() {
        mux := http.NewServeMux()  // こいつがどの endpoint にアクセスしてきたかを振り分けてくれる

        // endpoint1
        mux.HandleFunc(
                "/endpoint1",  // ← endpoint を登録
                func(w http.ResponseWriter, r *http.Request) {  // ← アクセスされたときのハンドラを書く.必要ならここで入力値のチェックとかする.
                        fmt.Println("entpoint1---")
                        fmt.Println("hello!")
                },
        )

        mux.HandleFunc(
                "/endpoint2",
                func(w http.ResponseWriter, r *http.Request) {
                        fmt.Println("entpoint2---")
                        fmt.Println("id:", r.FormValue("id"))
                },
        )
        ts := httptest.NewServer(mux)
        defer ts.Close()

        // テストサーバにアクセスしてみる
        http.Get(ts.URL + "/endpoint1") // ← ts.URL でベースのURLが返ってくる
        http.PostForm(ts.URL+"/endpoint2", url.Values{"id": {"123"}})
}

output:

entpoint1---
hello!
entpoint2---
id: 123

・・・大規模になったらどうやってテストするのがいいのかな.いちいち書くのもだるい感じもする.いい方法知りたい。