Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GopherCon2018

ktr
September 21, 2018
1.6k

 GopherCon2018

ktr

September 21, 2018
Tweet

Transcript

  1. GopherCon 2018 に
    参加 & トークしてきた
    ROPPONGI TYO, SEP 21 2018
    Taro Aoki
    u-aizu
    @ktr_0731

    View Slide

  2. Who am I? 01
    Workshop: Testing
    Session: gRPC reflection and grpcurl
    LT: Evans more expressive gRPC client
    Summary
    02
    03
    04
    05

    View Slide

  3. Who am I?
    01

    View Slide

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

    View Slide

  5. Workshop:
    Testing
    02

    View Slide

  6. Workshop: Testing
    ● Mat Ryer 氏
    ○ stretchr/testify
    ○ Go Programming
    Blueprints

    View Slide

  7. Workshop: Testing
    1. よりよいテストを書くために
    2. Go でのテストの基本
    3. 非同期処理のあるテスト
    4. Web アプリのユニットテスト
    5. Web アプリのインテグレーションテスト
    6. 依存のモッキング

    View Slide

  8. 1. よりよいテストを書くために
    ● テストを書く必要性
    ● 正しいレイヤーで適切な振る舞いをテストする
    ● テストメッセージを明確に書く

    View Slide

  9. 2. Go でのテストの基本
    ● GoDoc やコマンドヘルプに書いてある内容
    ● 意外と知らないことも
    ○ testing.Verbose
    ○ -run は正規表現が使える
    ○ SIGQUIT でテストのタイムアウトができる
    ○ パッケージ名 _test

    View Slide

  10. 3. 非同期処理のあるテスト (KVS)

    View Slide

  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
    }
    }

    View Slide

  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 は
    ブロックする

    View Slide

  13. 3. 非同期処理のあるテスト (KVS)
    ticker := time.NewTicker(
    10 * time.Millisecond)
    defer ticker.Stop()
    Ticker を定義

    View Slide

  14. 3. 非同期処理のあるテスト (KVS)
    for {
    // do something
    select {
    case <-time.After(duration):
    return errors.New("timeout")
    case <-ticker.C:
    continue
    }
    }
    for + select
    パターン

    View Slide

  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
    }
    }
    }
    ヘルパー関数へ
    切り出し

    View Slide

  16. 4. Web アプリのユニットテスト
    ● ハンドラ (http.Handler) のテスト
    ● httptest の使い方
    ○ ResponseRecorder
    ○ NewRequest

    View Slide

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

    View Slide

  18. 6. 依存のモッキング
    ● Web アプリケーションは KVS 実装に
    強く依存している
    ● Interface によって疎結合にする

    View Slide

  19. 6. 依存のモッキング
    type KVS interface {
    Set(k string, v interface{})
    Get(k string) (v interface{}, ok bool)
    }
    Interface の定義

    View Slide

  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 も同様
    関数フィールドを
    使ったスタブ

    View Slide

  21. 6. 依存のモッキング
    ● 非同期処理に依存しなくなった
    ● matryer/moq

    View Slide

  22. Session:
    gRPC reflection and
    grpcurl
    03

    View Slide

  23. Session: gRPC reflection and grpcurl
    ● Joshua Humphries 氏 (@jhump)
    ○ fullstorydev/grpcurl
    ○ jhump/protoreflect
    ○ gRPC メンバー

    View Slide

  24. FullStory 社のサーバ構成

    View Slide

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

    View Slide

  26. クライアント CLI の問題
    ● リフレクションの必要性
    ○ Protocol Buffers の型情報
    ○ gRPC サービスの API 一覧

    View Slide

  27. Protocol Buffers reflection
    ● Dynamic message
    ○ 任意のメッセージを動的に組み立てる
    ○ Java、C++ でサポート
    ○ Go ではサポートされていない

    View Slide

  28. Protocol Buffers reflection
    ● jhump/protoreflect
    ○ Go でリフレクションを実現するためのパッ
    ケージ群
    ○ desc
    ○ dynamic
    ○ protoparse

    View Slide

  29. Protocol Buffers reflection
    ● jhump/protoreflect/desc
    ○ Dynamic message のために必要な情報を
    追加した descriptor 拡張

    View Slide

  30. Protocol Buffers reflection
    ● jhump/protoreflect/dynamic
    ○ Dynamic message の実装パッケージ
    ○ map + proto.Message

    View Slide

  31. Protocol Buffers reflection
    ● jhump/protoreflect/protoparse
    ○ protoc なしで proto をパースするための
    パッケージ

    View Slide

  32. gRPC reflection
    ● gRPC が Protocol Buffers で定義
    ○ grpc/grpc/reflection/v1alpha/reflection.proto
    ● 公式の Go 実装も存在
    ○ grpc/grpc-go/reflection

    View Slide

  33. gRPCurl
    ● fullstorydev/grpcurl
    ● gRPC リフレクション + jhump/protoreflect
    ● curl ライクなインターフェース

    View Slide

  34. gRPCurl

    View Slide

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

    View Slide

  36. Lightning Talk
    ● 申込みが BOLD Scholarship の参加条件
    ● 英語で 7 分
    ● First Come, First Serve

    View Slide

  37. View Slide

  38. LT テーマ
    ● 自作 gRPC クライアントの Evans について
    ○ 一度 Go 1.10 リリースパーティで
    話していた
    ○ これをベースに再構成

    View Slide

  39. LT 当日まで
    ● できる限り早くスライドをつくる
    ● トークスクリプトを用意する
    ● ひたすら練習するしかない
    ○ @tenntenn さん、@osamingo さん、
    @deeeet さん、@morikuni さん、
    @codehex さんの前で発表練習

    View Slide

  40. LT 当日まで

    View Slide

  41. View Slide

  42. View Slide

  43. 当日までに気をつけること
    ● 募集開始時期
    ● 資料のバックアップ
    ● トークスクリプト
    ● 十分に余裕を持って会場入りする
    ● 本番直前のミラーリングの設定確認を
    必ず受ける

    View Slide

  44. GopherCon で LT をして
    ● 正直苦しかった
    ○ 英語苦手
    ○ 人前で喋るのも苦手
    ○ 当日アクシデント
    ● それでもやって良かった
    ○ PR や Issue を多く貰えた
    ○ 参加ブログで紹介された

    View Slide

  45. Summary
    05

    View Slide

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

    View Slide

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

    View Slide

  48. Thank you!
    @ktr_0731
    @ktr0731

    View Slide