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

GopherCon2018

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ktr ktr
September 21, 2018
1.8k

 GopherCon2018

Avatar for ktr

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 を多く貰えた ◦ 参加ブログで紹介された