Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Who am I? 01

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Workshop: Testing 02

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Session: gRPC reflection and grpcurl 03

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

FullStory 社のサーバ構成

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

gRPCurl

Slide 35

Slide 35 text

Lightning Talk: Evans: more expressive gRPC client 04

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

LT 当日まで

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

Summary 05

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Thank you! @ktr_0731 @ktr0731