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

次世代タクシー配車サービス「MOV」におけるテスト事例紹介

 次世代タクシー配車サービス「MOV」におけるテスト事例紹介

- MOV紹介
- 前提環境
- テストを書く上での方針
- 並列テストのためのデータ生成
- DIできないコードと戦う
- その他tips

tokubass

July 18, 2019
Tweet

Other Decks in Programming

Transcript

  1. 並列テストのためのデータ生成 前述の github.com/bxcodec/faker を使用 テスト用のユーザを作りたい場合などに構造体のgotag を利用してダミ ーデータを生成する type User struct

    { Name string // ランダムな文字列を生成 Email string `faker:"email"` // email 形式で生成 } s := SomeStruct{} faker.FakeData(&s) faker:"email" のようにデフォルトで用意されているタグ以外にもプロダ クト用に自作のtag を作ることができる 9
  2. ラッパー package util var nowFunc func() time.Time func init() {

    // setter 関数はテスト時にしか定義されない nowFunc = time.Now } func Now() time.Time { return nowFunc() } 13
  3. setter // +build test package util import ( "sync" "time"

    ) var m sync.Mutex func SetNowFunc(f func() time.Time) func() { m.Lock() nowFunc = f return func() { m.Unlock() } } 14
  4. 利用例 func TestXXXX(t *testing.T) { unlock := util.SetNowFunc(func() time.Time {

    return time.Date(...) // 省略 }) defer unlock() ... } 15
  5. Client 実装をファイル単位で偽装 - DI できない コードと戦う build タグを使うことでファイル単位で偽装する大技 基本アイデア link

    利用例 var gotMessageText string reset := infra.SetMock_Send(func(message domain.MailMessage) error { gotMessageText = message.TextPart return nil }) defer reset() 16
  6. testerator がサーバーを落とす条件 内部カウンター(Setup.counter) が0 になったとき SpinUp で+1, SpinDown で-1 Setup.total

    % Setup.ResetThreshold == 0 のとき total はSpinUp のときに+1 される RestThreshold はデフォルトで1000 counter が0 にならないように中央管理 テストごとに実装者がSpinUp,SpinDown を記述していると内部カウ ンタが0 になるタイミングが発生した SpinUp するラッパー関数を用意し中央管理 19