ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

ローカルDBからbakeコマンドでfixture生成 #cakephp3

f:id:yourmystar_engineer:20190725124610p:plain

どうも。ユアマイスター星(@inase17000)です。

現在こそこそテストコードを毎日15分〜30分リファクタリングする活動をしておりまして、その中でマスター系のデータのFixtureがだいぶ昔に作られたままで実情と合っていないところがあったので最新化しようと思いました。

「Fixtureのコードを1レコードずつ手で作らないといけないなんてありえない!」と思ったので、楽できる方法を速攻探したところズバリあったのでメモしておきます。

環境

ググってみる

先人がブログを書いてくれていて、参考*1にさせていただきました。ありがとうございます。

オフィシャルドキュメント*2はなんだかちょっとよくわからないことになっていたので、貢献したくなりました。(また今度...)

helpを読んでみる

ブログにもコマンドの記載があったんですが、細かい仕様を確認したいなと思ったので次にとりあえずhelpを見てみました。

bash-4.2# bin/cake bake fixture --help
Generate fixtures for use with the test suite. You can use `bake fixture
all` to bake all fixtures.

Usage:
cake bake.bake fixture [subcommand] [options] [<name>]

Subcommands:

all  Bake all fixture files for tables in the chosen connection.

To see help on a subcommand use `cake bake.bake fixture [subcommand] --help`

Options:

--conditions      The SQL snippet to use when importing records.
                  (default: 1=1)
--connection, -c  The datasource connection to get data from.
                  (default: default)
--count, -n       When using generated data, the number of records to
                  include in the fixture(s). (default:
                  1)
--force, -f       Force overwriting existing files without prompting.
--help, -h        Display this help.
--plugin, -p      Plugin to bake into.
--quiet, -q       Enable quiet output.
--records, -r     Generate a fixture with records from the non-test
                  database. Used with --count and --conditions to limit
                  which records are added to the fixture.
--schema, -s      Create a fixture that imports schema, instead of
                  dumping a schema snapshot into the fixture.
--table           The table name if it does not follow conventions.
--theme, -t       The theme to use when baking code. (choices:
                  Bake|Migrations)
--verbose, -v     Enable verbose output.

Arguments:

name  Name of the fixture to bake (without the `Fixture` suffix). You
      can use Plugin.name to bake plugin fixtures.
      (optional)

ポイントとなるのは、

  • --force, -f
    • もともとFixtureファイルがあっても上書きする
  • --records, -r
    • テスト用DBではなくて、アプリケーション用DBの内容からFixtureを作成する
    • --count--conditions が併用可能
  • --schema, -s
    • schema関連ファイルを読み込んでFixtureを生成する
    • このオプションを指定しないと、代わりにFixtureの中にschemaのスナップショットが記載される
  • --count, -n
    • 何レコードまでFixtureに入れるか指定する

ここらへんでした。僕らの環境では、

bin/cake bake fixture -r -f -n 100 -s areas

参考情報と同様に、こんなコマンドで行数のところを適宜調整しながら実行するとうまくいきました。

課題

  • マスター系データが更新される度にFixtureを作り直す必要がある
    • 手動でマスタ系のデータに追いついていくのめんどくさいなあ
    • 基本的にロジックが変わらなければテストコードの責任範囲は守れるんだけど、データによって結果が変わるケースの検証漏れが発生しそう
    • いまのところ気合でFixtureを作り直し続けるガッツが必要

以上、簡単にですが気になったポイントをまとめておきます!

夏 is coming!!