Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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