fixture

最終更新:2020/05/18


目次

  1. fixtureとは
  2. fixtureの構成
  3. テストデータの作成
  4. テストデータを取得する

1. fixtureとは

fixture(フィクスチャ)はテストデータを編成する方法の1つです。

WEBフレームワークのRailsでテストコードを書くときに導入されたテスト手法です。

テストデータをfixtureとして分離するとテストコードのメンテナンスコストが下がるます。

なので、データベースを使うプロジェクトではfixturewの仕組みを取り入れると良いでしょう。

2. fixtureの構成

Go言語でfixtureを構成する場合は、自前でfixtureパッケージを作成します。

ほとんどのGo言語のプロジェクトは

Standard Go Project Layout

の構成を基本としていると思います。

その場合

テストコードを読み込むソースコードを実装するのに

pkg/fixture

フォルダにfuxtureパッケージを作り、

テストコードを配置するのに、

/test/testdata

を利用するとわかりやすいです。

3. テストデータの作成

テストデータは、jsonかyamlで作成します。

私はjsonで作成しています。

{ "data": [{ "user_id": 1, "name": "taro", "birthday": "2020/03/17", "sex": 1 }] }

全てのデータパターンを手動で作成するのは現実的でないので、fixture json生成スクリプトを作成するようにしましょう。

また出力するjsonにはtest_descriptionの項目を追加しておくことをオススメします。

{ "data": [{ "user_id": 1, "name": "taro", "birthday": "2020/03/17", "sex": 1, "test_description": "一般的なユーザー情報" }] }

test_descriptionを用意して、データの概要を書いておくと後々コードを見直した時に役立ちます。

また、スクリプトはできればmodelやrepositoryなども同時に生成できるようにしておきましょう。

そのうち、私の作成したスクリプトをgitHubで公開します。

4. テストデータを取得する

作ったテストデータjsonからデータを取得する関数を実装します。

package fixture import ( "encoding/json" "errors" "io/ioutil" "log" "path/filepath" "time" "github.com/java-lang-programming/go-api/internal/config" "github.com/java-lang-programming/go-api/pkg/domain/model" ) // UsersFixture is a struct for reading the fixture. type UsersFixture struct { Data []UserFixture `json:"data"` } // UserFixture is that データの詳細 type UserFixture struct { UserID int `json:"user_id"` Name string `json:"name"` Birthday time.Time `json:"birthday"` Sex int `json:"sex"` } // LoadUsersFixture is that load fixture file. func LoadUsersFixture() UsersFixture { // フィクスチャーを読み込む testFilePath := Root + "/go-api/test/testdata/users.json" b, err := ioutil.ReadFile(filepath.Clean(testFilePath)) if err != nil { log.Fatal(err) } var f UsersFixture if err := json.Unmarshal(b, &f); err != nil { log.Fatal(err) } return f } // FindByUserID finds Employee object. func FindByUserID(ID int) (*model.User, error) { fixture := LoadUsersFixture() for _, f := range fixture.Data { if f.ID == ID { user := &model.User{ // TODO fields } user.ID = uint(f.ID) return user, nil } } return nil, errors.New(config.GormRecordNotFound) }

上記のコードは

FindByUserID

関数でmodelオブジェクトを取得します。

この関数を用意しておくことで、テスト用DBがなくてもモデルの結果を取得できます。