GopherCon2018

398137161a861ee5412b84b234c65187?s=47 ktr
September 21, 2018
1.3k

 GopherCon2018

398137161a861ee5412b84b234c65187?s=128

ktr

September 21, 2018
Tweet

Transcript

  1. GopherCon 2018 に 参加 & トークしてきた ROPPONGI TYO, SEP 21

    2018 Taro Aoki u-aizu @ktr_0731
  2. Who am I? 01 Workshop: Testing Session: gRPC reflection and

    grpcurl LT: Evans more expressive gRPC client Summary 02 03 04 05
  3. Who am I? 01

  4. Who am I? Taro Aoki (ktr、キタロー) @ktr_0731 @ktr0731 University of

    Aizu
  5. Workshop: Testing 02

  6. Workshop: Testing • Mat Ryer 氏 ◦ stretchr/testify ◦ Go

    Programming Blueprints
  7. Workshop: Testing 1. よりよいテストを書くために 2. Go でのテストの基本 3. 非同期処理のあるテスト 4.

    Web アプリのユニットテスト 5. Web アプリのインテグレーションテスト 6. 依存のモッキング
  8. 1. よりよいテストを書くために • テストを書く必要性 • 正しいレイヤーで適切な振る舞いをテストする • テストメッセージを明確に書く

  9. 2. Go でのテストの基本 • GoDoc やコマンドヘルプに書いてある内容 • 意外と知らないことも ◦ testing.Verbose

    ◦ -run は正規表現が使える ◦ SIGQUIT でテストのタイムアウトができる ◦ パッケージ名 _test
  10. 3. 非同期処理のあるテスト (KVS)

  11. 3. 非同期処理のあるテスト (KVS) func TestGet(t *testing.T) { // setup db.Set(“key”,

    “val”) for { // wait until written time.Sleep(3 * time.Second) val, _ := db.Get(“key”) // check and test value // retry or break } }
  12. 3. 非同期処理のあるテスト (KVS) func TestGet(t *testing.T) { // setup db.Set(“key”,

    “val”) for { // wait until written time.Sleep(3 * time.Second) val, _ := db.Get(“key”) // check and test value // retry or break } } time.Sleep は ブロックする
  13. 3. 非同期処理のあるテスト (KVS) ticker := time.NewTicker( 10 * time.Millisecond) defer

    ticker.Stop() Ticker を定義
  14. 3. 非同期処理のあるテスト (KVS) for { // do something select {

    case <-time.After(duration): return errors.New("timeout") case <-ticker.C: continue } } for + select パターン
  15. 3. 非同期処理のあるテスト (KVS) func withTimeout(duration time.Duration, fn func()) { var

    err error for { if err = fn(); err == nil { return nil } select { case <-time.After(duration): return fmt.Errorf( "timeout: last error = %s", err) case <-ticker.C: continue } } } ヘルパー関数へ 切り出し
  16. 4. Web アプリのユニットテスト • ハンドラ (http.Handler) のテスト • httptest の使い方

    ◦ ResponseRecorder ◦ NewRequest
  17. 5. Web アプリのインテグレーションテスト • 実際にサーバを立ち上げてのテスト • httptest.NewServer • --httptest.serve

  18. 6. 依存のモッキング • Web アプリケーションは KVS 実装に 強く依存している • Interface

    によって疎結合にする
  19. 6. 依存のモッキング type KVS interface { Set(k string, v interface{})

    Get(k string) (v interface{}, ok bool) } Interface の定義
  20. 6. 依存のモッキング type kvsStub struct { set func(k string, v

    interface{}) get func(k string) (v interface{}, ok bool) } func (s *kvsStub) Set(k string, v interface{}) { if s.set == nil { panic("set field is nil") } s.set(k, v) } // Get も同様 関数フィールドを 使ったスタブ
  21. 6. 依存のモッキング • 非同期処理に依存しなくなった • matryer/moq

  22. Session: gRPC reflection and grpcurl 03

  23. Session: gRPC reflection and grpcurl • Joshua Humphries 氏 (@jhump)

    ◦ fullstorydev/grpcurl ◦ jhump/protoreflect ◦ gRPC メンバー
  24. FullStory 社のサーバ構成

  25. クライアント CLI の問題 • アグリゲータのエンドポイントが 変わるたびに修正が必要 • 同じロジックの繰り返し • Protocol

    Buffers 定義ファイルが必要
  26. クライアント CLI の問題 • リフレクションの必要性 ◦ Protocol Buffers の型情報 ◦

    gRPC サービスの API 一覧
  27. Protocol Buffers reflection • Dynamic message ◦ 任意のメッセージを動的に組み立てる ◦ Java、C++

    でサポート ◦ Go ではサポートされていない
  28. Protocol Buffers reflection • jhump/protoreflect ◦ Go でリフレクションを実現するためのパッ ケージ群 ◦

    desc ◦ dynamic ◦ protoparse
  29. Protocol Buffers reflection • jhump/protoreflect/desc ◦ Dynamic message のために必要な情報を 追加した

    descriptor 拡張
  30. Protocol Buffers reflection • jhump/protoreflect/dynamic ◦ Dynamic message の実装パッケージ ◦

    map + proto.Message
  31. Protocol Buffers reflection • jhump/protoreflect/protoparse ◦ protoc なしで proto をパースするための

    パッケージ
  32. gRPC reflection • gRPC が Protocol Buffers で定義 ◦ grpc/grpc/reflection/v1alpha/reflection.proto

    • 公式の Go 実装も存在 ◦ grpc/grpc-go/reflection
  33. gRPCurl • fullstorydev/grpcurl • gRPC リフレクション + jhump/protoreflect • curl

    ライクなインターフェース
  34. gRPCurl

  35. Lightning Talk: Evans: more expressive gRPC client 04

  36. Lightning Talk • 申込みが BOLD Scholarship の参加条件 • 英語で 7

    分 • First Come, First Serve
  37. None
  38. LT テーマ • 自作 gRPC クライアントの Evans について ◦ 一度

    Go 1.10 リリースパーティで 話していた ◦ これをベースに再構成
  39. LT 当日まで • できる限り早くスライドをつくる • トークスクリプトを用意する • ひたすら練習するしかない ◦ @tenntenn

    さん、@osamingo さん、 @deeeet さん、@morikuni さん、 @codehex さんの前で発表練習
  40. LT 当日まで

  41. None
  42. None
  43. 当日までに気をつけること • 募集開始時期 • 資料のバックアップ • トークスクリプト • 十分に余裕を持って会場入りする •

    本番直前のミラーリングの設定確認を 必ず受ける
  44. GopherCon で LT をして • 正直苦しかった ◦ 英語苦手 ◦ 人前で喋るのも苦手

    ◦ 当日アクシデント • それでもやって良かった ◦ PR や Issue を多く貰えた ◦ 参加ブログで紹介された
  45. Summary 05

  46. Summary • Go コミュニティの活発さがわかる • 著名な Go エンジニアがたくさんいる • ビギナー含め、あらゆる

    Gophers が 楽しめる場所
  47. Summary • 学生が自費で海外のカンファレンスに 行くのは大変 • スカラシップならあらゆる面で サポートしてくれる • ぜひ行きましょう

  48. Thank you! @ktr_0731 @ktr0731