😀

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

2023/04/06に公開

概要

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