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

GopherCon2018

ktr
September 21, 2018
1.8k

 GopherCon2018

ktr

September 21, 2018
Tweet

More Decks by ktr

Transcript

  1. Who am I? 01 Workshop: Testing Session: gRPC reflection and

    grpcurl LT: Evans more expressive gRPC client Summary 02 03 04 05
  2. Workshop: Testing 1. よりよいテストを書くために 2. Go でのテストの基本 3. 非同期処理のあるテスト 4.

    Web アプリのユニットテスト 5. Web アプリのインテグレーションテスト 6. 依存のモッキング
  3. 2. Go でのテストの基本 • GoDoc やコマンドヘルプに書いてある内容 • 意外と知らないことも ◦ testing.Verbose

    ◦ -run は正規表現が使える ◦ SIGQUIT でテストのタイムアウトができる ◦ パッケージ名 _test
  4. 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 } }
  5. 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 は ブロックする
  6. 3. 非同期処理のあるテスト (KVS) for { // do something select {

    case <-time.After(duration): return errors.New("timeout") case <-ticker.C: continue } } for + select パターン
  7. 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 } } } ヘルパー関数へ 切り出し
  8. 6. 依存のモッキング type KVS interface { Set(k string, v interface{})

    Get(k string) (v interface{}, ok bool) } Interface の定義
  9. 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 も同様 関数フィールドを 使ったスタブ
  10. Session: gRPC reflection and grpcurl • Joshua Humphries 氏 (@jhump)

    ◦ fullstorydev/grpcurl ◦ jhump/protoreflect ◦ gRPC メンバー
  11. LT テーマ • 自作 gRPC クライアントの Evans について ◦ 一度

    Go 1.10 リリースパーティで 話していた ◦ これをベースに再構成
  12. GopherCon で LT をして • 正直苦しかった ◦ 英語苦手 ◦ 人前で喋るのも苦手

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