😀
Go でテスト用のサーバを立ててクライアントのテストする
概要
Go なら 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
・・・大規模になったらどうやってテストするのがいいのかな.いちいち書くのもだるい感じもする.いい方法知りたい。
Discussion