本記事
本記事はGolangのHTTP APIサーバーのテストを行なって行こうと思います。
また、うかつにハッカソンで非推奨のGolangのWAFであるIrisを使ってしまい、とんでもなく反省していますが、手法としてはどのフレームワークもだいたい同じなので、この際に包み隠さず記事にしています。
APIサーバーを構築する
以下のようにmain.go
はなっています。
func main() { app := app.NewIrisApp(db) app.Run(iris.Addr(":8880")) }
そして、以下のように呼び出されています。
func NewIrisApp(db types.Datastorable) *iris.Application { stripe.Key = os.Getenv("SECRET_KEY") app := iris.Default() app.Get("/healthy", func(ctx iris.Context) { ctx.WriteString("Haha! I am healthy.") }) ctr := handler.NewController(db) api := app.Party(fmt.Sprintf("/v%v", types.VERSION)) api.Post("/payment", ctr.ExecPayment()) return app }
つまり以下のようにAPIが設計されています。
Path |
---|
/healthy |
/v1/payment |
テストを書く
以下のようにテストを書きます。試しにGET
では成功してPOST
では失敗することをチェックしています。
func TestNewIrisApp(t *testing.T) { t.Helper() t.Run("/healthy", func(t *testing.T) { mdb := new(handler.MockDB) app := NewIrisApp(mdb) e := httptest.New(t, app, httptest.URL("http://payment:8880.com")) e.GET("/healthy").WithHeaders(map[string]string{ "Content-Type": "application/json", }).Expect().Status(httptest.StatusOK) e.POST("/healthy").WithHeaders(map[string]string{ "Content-Type": "application/json", }).Expect().Status(httptest.StatusNotFound) }) }
ポイントとしては
httptest
を使ってテストをするhandler
をhttptest
に置いてテストをするExpect()
はRequest
構造体のメソッドで、*Responce
が戻り値である
だけです。非常に簡単にテストをすることができます。
以下のコマンドで実行できます。
go test -v ./...
クエリパラメータをチェックする
例えばクエリパラメータでuserID
が必要なものがあったりすれば、以下のように失敗するかをテストをすることができます。
t.Run("missing userID", func(t *testing.T) { mdb := new(handler.MockDB) app := NewIrisApp(mdb) e := httptest.New(t, app, httptest.URL("http://payment:8880.com")) req := e.POST("/v1/payment") req.WithQuery("amount", 1000) // req.WithQuery("userID", 3) is missing req.Expect().Status(httptest.StatusBadRequest) })
Bodyをテストする
今まではステータスコードが404
なのかなどをチェックしてきました。
ステータスコードが、あっていても、中身があっている保証はありませんのでテストをしていきます。
resp.JSON().Object().ContainsMap(iris.Map{ "error": "", "message": iris.Map{ "amount": testAmount, "currency": stripe.String(string(stripe.CurrencyJPY)), "description": description, }, })
これはIris
に限らず、適当なMapや構造体を渡すとあっているかチェックしてくれます。
また、ContainsMap
の名前からあるように含まれるかをチェックしているので、どんなオブジェクトが返ってくるかわからないものは、無視してもいいかもしれません。
まとめ
特にHTTP APIサーバーのAPIのテストは難しいイメージがありますが、本当に簡単にできるのでぜひやってみてください。
なぜテストをするか、テスト手法に対しては以下の本が参考になります。

レガシーコード改善ガイド (Object Oriented SELECTION)
- 作者: マイケル・C・フェザーズ,ウルシステムズ株式会社,平澤章,越智典子,稲葉信之,田村友彦,小堀真義
- 出版社/メーカー: 翔泳社
- 発売日: 2009/07/14
- メディア: 大型本
- 購入: 45人 クリック: 673回
- この商品を含むブログ (157件) を見る

【この1冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践
- 作者: 石原一宏,田中英和,田中真史
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2012/01/28
- メディア: 単行本
- 購入: 2人 クリック: 12回
- この商品を含むブログ (9件) を見る

- 作者: Kent Beck,和田卓人
- 出版社/メーカー: オーム社
- 発売日: 2017/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る

- 作者: Jonathan Rasmusson,玉川紘子
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/09/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る