最終更新:2020/05/18
目次
- fixtureとは
- fixtureの構成
- テストデータの作成
- テストデータを取得する
1. fixtureとは
fixture(フィクスチャ)はテストデータを編成する方法の1つです。
WEBフレームワークのRailsでテストコードを書くときに導入されたテスト手法です。
テストデータをfixtureとして分離するとテストコードのメンテナンスコストが下がるます。
なので、データベースを使うプロジェクトではfixturewの仕組みを取り入れると良いでしょう。
2. fixtureの構成
Go言語でfixtureを構成する場合は、自前でfixtureパッケージを作成します。
ほとんどのGo言語のプロジェクトは
の構成を基本としていると思います。
その場合
テストコードを読み込むソースコードを実装するのに
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がなくてもモデルの結果を取得できます。