Slide 1

Slide 1 text

Flute ‒ Go HTTP Client Testing Framework 2019-07-13 Go Conference'19 Summer in Fukuoka Shunsuke Suzuki 1

Slide 2

Slide 2 text

⾃⼰紹介 https://github.com/suzuki-shunsuke/profile 東京から来ました 社内システムやOSSをGoで開発してます 2

Slide 3

Slide 3 text

元々発表する予定はなかったのですが、LT枠があるということを当⽇知り、 折⾓のチャンスなので急遽発表させていただきました 3

Slide 4

Slide 4 text

今⽇話すこと ⾃作のOSS (HTTP Client Testing Framework) の紹介 いかに API クライアントのテストを楽に書くか 4

Slide 5

Slide 5 text

皆さん、APIクライアント書いてますか? 5

Slide 6

Slide 6 text

APIクライアントのテスト書いてますか? 6

Slide 7

Slide 7 text

APIクライアントのテスト 正しいリクエストを送っているか • method, リクエストパス, クエリ, ヘッダ • リクエストボディ、etc 正しくレスポンスを処理しているか • レスポンスボディのパース 7

Slide 8

Slide 8 text

APIクライアントのテスト 正しいリクエストを送っているか • method, リクエストパス, クエリ, ヘッダ • リクエストボディ、etc 正しくレスポンスを処理しているか • レスポンスボディのパース 8 どのAPIでもやってることは同じ フレームワーク化して楽したい

Slide 9

Slide 9 text

既存のライブラリ 他に使えそうなライブラリは⾊々ある • https://github.com/avelino/awesome-go#testing • https://github.com/h2non/gock • https://github.com/seborama/govcr • https://github.com/jarcoal/httpmock • https://github.com/tv42/mockhttp • https://github.com/gavv/httpexpect • https://github.com/dnaeon/go-vcr • https://github.com/h2non/baloo 9

Slide 10

Slide 10 text

• モック化出来るものは多いが、リクエストパラメータのテスト できるものは少ない • 今まで gock を使ってたが、リクエストがマッチしなくてテス トに失敗しても理由がわからないので不便 • ニーズに合うのが⾒つからない 10

Slide 11

Slide 11 text

• モック化出来るものは多いが、リクエストパラメータのテスト できるものは少ない • 今まで gock を使ってたが、リクエストがマッチしなくてテス トに失敗しても理由がわからないので不便 • ニーズに合うのが⾒つからない 11 なければ⾃作しよう

Slide 12

Slide 12 text

Go でいかにモックを書くか • httptest で簡単なモックサーバを起動 • http.RoundTripper を実装 12

Slide 13

Slide 13 text

Go でいかにモックを書くか • httptest で簡単なモックサーバを起動 • テストまで含めると実装が⾯倒 • client のエンドポイントを修正できないとモック化が難しい • http.RoundTripper を実装 13

Slide 14

Slide 14 text

Go でいかにモックを書くか • httptest で簡単なモックサーバを起動 • http.RoundTripper を実装: 今回はこっち 14

Slide 15

Slide 15 text

作ったやつ: Flute • https://github.com/suzuki-shunsuke/flute • Go の HTTP client のテスティングフレームワーク 15

Slide 16

Slide 16 text

作ったやつ: Flute • https://github.com/suzuki-shunsuke/flute • Go の HTTP client のテスティングフレームワーク 16 プロジェクト名が変わりました(旧 Fagott) https://github.com/suzuki-shunsuke/flute/issues/20 2019-07-16 追記

Slide 17

Slide 17 text

Flute で出来ること • リクエストパラメータのテスト • リクエストボディ、method, リクエストパス, クエリ, ヘッダ, ユーザー定義関数 • HTTPサーバのモック化 17

Slide 18

Slide 18 text

サンプル: ユーザー作成の簡単なクライアント 18

Slide 19

Slide 19 text

19 https://github.com/suzuki-shunsuke/flute/blob/master/examples/create_user.go

Slide 20

Slide 20 text

20 *http.Client.Transport に *flute.Transport を渡す

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

22 1. Matcher にマッチしたリクエストを 2. Tester でテストし 3. Response で指定したレスポンスを返す

Slide 23

Slide 23 text

23 テストケースを宣⾔的に記述するだけでよい

Slide 24

Slide 24 text

リクエストパラメータのテスト • 内部で testify の assert を使っている • テストにコケたときに原因が分かりやすい 24

Slide 25

Slide 25 text

25 例: ヘッダが期待通りじゃなかった場合

Slide 26

Slide 26 text

まとめ • APIクライアントのテストのフレームワークを作りました • HTTPサーバのモック化だけでなく、 リクエストパラメータのテストも出来ます • 基本的なテストはテストケースを宣⾔的に書くだけ • Goではhttp.RoundTripper を活⽤すると簡単にモック化出来ます 26